zoukankan      html  css  js  c++  java
  • RabbitMQ基础概念及使用

    RabbitMQ

    RabbitMQ是什么?

    RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。
    MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。RabbitMQ可以,多个程序同时使用RabbitMQ ,但是必须队列名称不一样。采用erlang语言,属于爱立信公司开发的。

    优势

    1、解耦合(分离请求和动作,要有异步思维)
    2、提供扩展性,通过增加消费者来提高系统处理订单的效率(线性)
    3、提供各种版本的API(使用任何常用语言基本没有障碍)
    4、要满足对实时性的忽略
    可解决系统设计的两个重大问题
    第一条:可以满足未来业务需求的不断变化和增加,也就是说扩展性强!
    第二条:要满足性能的可伸缩性. 也就是可集群性…通过增加机器能处理更多的请求
    """类似可支持大并发,例如:我系统本来只可以支持10个人的任务,突然来了100人,都给我发任务,这种情况下,可以我理论上可以先将100人的任务接下来,
    然后慢慢的消化任务(有一个前提,要对任务的实时性不关注,理论上就是异步)"""

    同步概念:就是在发出一个“调用or请求”时,在没有得到结果之前,该“调用or请求”就不返回。
    异步概念:异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。

    系统架构

    AMQP是一个异步消息传递所使用的应用层协议规范,AMQP客户端能够无视消息来源任意发送和接受消息,Broker提供消息的路由、队列等功能。Broker主要由Exchange和Queue组成:Exchange负责接收消息、转发消息到绑定的队列;Queue存储消息,提供持久化、队列等功能。AMQP客户端通过Channel与Broker通信,Channel是多路复用连接中的一条独立的双向数据流通道。

    基础概念

    Broker:简单来说就是消息队列服务器实体。
    Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
    Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
    Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
    Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
    vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
    producer:消息生产者,就是投递消息的程序。
    consumer:消息消费者,就是接受消息的程序。
    channel:消息通道(信道),在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

    Exchange
    Exchange类似于数据通信网络中的交换机,提供消息路由策略。rabbitmq中,producer不是通过信道直接将消息发送给queue,而是先发送给Exchange。一个Exchange可以和多个Queue进行绑定,producer在传递消息的时候,会传递一个ROUTING_KEY,Exchange会根据这个ROUTING_KEY按照特定的路由算法,将消息路由给指定的queue。和Queue一样,Exchange也可设置为持久化,临时或者自动删除。
    Exchange有4种类型:direct(默认),fanout, topic, 和headers,不同类型的Exchange转发消息的策略有所区别

      Direct

      直接交换器,工作方式类似于单播,Exchange会将消息发送完全匹配ROUTING_KEY的Queue(如下图所示)

       

      Fanout
      广播是式交换器,不管消息的ROUTING_KEY设置为什么,Exchange都会将消息转发给所有绑定的Queue。(如下图所示)

       

      Topic
      主题交换器,工作方式类似于组播,Exchange会将消息转发和ROUTING_KEY匹配模式相同的所有队列(如下图所示)( * 表是匹配一个任意词组,#表示匹配0个或多个词组)

       

      Headers
      消息体的header匹配(很少用到,基本可以忽略
    Queue
    消息队列,提供了FIFO的处理机制,具有缓存消息的能力。rabbitmq中,队列消息可以设置为持久化,临时或者自动删除。
    1.设置为持久化的队列,queue中的消息会在server本地硬盘存储一份,防止系统crash,数据丢失
    2.设置为临时队列,queue中的数据在系统重启之后就会丢失
    3.设置为自动删除的队列,当不存在用户连接到server,队列中的数据会被自动删除

    Binding
    所谓绑定就是将一个特定的 Exchange 和一个特定的 Queue 绑定起来。Exchange 和Queue的绑定可以是多对多的关系。

    Virtual host
    在rabbitmq server上可以创建多个虚拟的message broker,又叫做virtual hosts (vhosts)。每一个vhost本质上是一个mini-rabbitmq server,分别管理各自的exchange,和bindings。vhost相当于物理的server,可以为不同app提供边界隔离,使得应用安全的运行在不同的vhost实例上,相互之间不会干扰。producer和consumer连接rabbit server需要指定一个vhost(默认为 "/")
    Channel
    一个channel(信道)可以简单的理解为一个会话任务,在建立的信道中可以进行传输和接收信息或任务;例如:每条电缆中的光纤都可以传输(就像一条信道),一条电缆中可以有许多的光纤,允许所有连接的光纤束同时进行传输和接收。TCP连接就像电缆,而信道就像是一条条独立的光纤;

    通信过程

    假设P1和C1注册了相同的Broker,Exchange和Queue。P1发送的消息最终会被C1消费。基本的通信流程大概如下所示:

    """
    1、P1生产消息,发送给服务器端的Exchange
    2、Exchange收到消息,根据ROUTINKEY,将消息转发给匹配的Queue1
    3、Queue1收到消息,将消息发送给订阅者C1
    4、C1收到消息,发送ACK给队列确认收到消息
    5、Queue1收到ACK,删除队列中缓存的此条消息
    """
    

    Consumer收到消息时需要显式的向rabbit broker发送basic.ack消息或者consumer订阅消息时设置auto_ack参数为true。在通信过程中,队列对ACK的处理有以下几种情况:

    1、如果consumer接收了消息,发送ack,rabbitmq会删除队列中这个消息,发送另一条消息给consumer。
    2、如果cosumer接受了消息, 但在发送ack之前断开连接,rabbitmq会认为这条消息没有被deliver,在    consumer在次连接的时候,这条消息会被redeliver。
    3、如果consumer接受了消息,但是程序中有bug,忘记了ack,rabbitmq不会重复发送消息。
    4、rabbitmq2.0.0和之后的版本支持consumer 拒绝某条(类)消息,可以通过设置requeue参数中的reject为true达到目地,那么rabbitmq将会把消息发送给下一个注册的consumer。
    
  • 相关阅读:
    Android摄像头採集的视频数据流怎样通过Socket实时发送到目标服务端
    linux c语言 select函数使用方法
    【CODEFORCES】 B. Dreamoon and Sets
    Cocos2d-x 3.0final 终结者系列教程15-win7+vs2012+adt+ndk环境搭建(无Cygwin)
    error MSB8011: 未能注冊输出。请尝试启用“逐用户重定向”
    Web服务(Web Service)相关概念
    HDU 5186 zhx's submissions (进制转换)
    GPS项目小结
    VS2008 格式化时候乱码 或者 为全为0
    JAX-WS HandlerChain使用具体解释
  • 原文地址:https://www.cnblogs.com/shangpolu/p/8268728.html
Copyright © 2011-2022 走看看