zoukankan      html  css  js  c++  java
  • RabbitMQ原理

    AMQP(高级消息队列协议 Advanced Message Queue Protocol)

    Rabbitmq系统最核心的组件是Exchange和Queue,下图是系统简单的示意图。Exchange和Queue是在rabbitmq server(又叫做broker)端,producer和consumer在应用端。

    使用思路

    边的Client向右边的Client发送消息,流程:

    1,  获取Conection

    2,  获取Channel

    3,  定义ExchangeQueue

    4,  使用一个RoutingKeyQueue Binding到一个Exchange

    5,  通过指定一个Exchange和一个RoutingKey来将消息发送到对应的Queue上,

    6,  接收方在接收时也是获取connection,接着获取channel,然后指定一个Queue直接到它关心的Queue上取消息,它对ExchangeRoutingKey及如何binding都不关心,到对应的Queue上去取消息就OK

    一个Client发送消息,哪些Client可以收到消息,其核心就在于ExchangeRoutingKeyQueue的关系上。

     

    Exchange

    RoutingKey

    Queue

    1

    E1

    R1

    Q1

    2

     

    R2

    Q2

    3

    E2

    R3

    Q1

    4

     

    R4

    Q2

    5

    E1

    R5

    Q1

    6

    E2

    R6

    Q1


    RoutingKey就像是个中间表,将两个表的数据进行多对多关联,只不过对于相同的ExchangeQueue,可以使用不同的RoutingKey重复关联多次。

    由结果可以看出,由Exchange,Queue,RoutingKey三个才能决定一个从Exchange到Queue的唯一的线路。

    通信过程

    假设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 reject某条(类)消息,可以通过设置requeue参数中的reject为true达到目地,那么rabbitmq将会把消息发送给下一个注册的consumer。

    vhosts(broker)

    一个RabbitMQ的实体上可以有多个vhosts,用户与权限设置就是依附于vhosts。

    在rabbitmq server上可以创建多个虚拟的message broker,又叫做virtual hosts (vhosts)。每一个vhost本质上是一个mini-rabbitmq server,分别管理各自的exchange,和bindings。vhost相当于物理的server,可以为不同app提供边界隔离,使得应用安全的运行在不同的vhost实例上,相互之间不会干扰。producer和consumer连接rabbit server需要指定一个vhost。

    connection 与 channel(连接与信道)

    connection是指物理的连接,一个client与一个server之间有一个连接;一个连接上可以建立多个channel,可以理解为逻辑上的连接。一般应用的情况下,有一个channel就够用了,不需要创建更多的channel。 

    exchange 与  routingkey(交换机与路由键)

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

    Exchange有4种类型:direct(默认),fanout, topic, 和headers,不同类型的Exchange转发消息的策略有所区别:

    1. Direct 直接交换器,工作方式类似于单播,Exchange会将消息发送完全匹配ROUTING_KEY的Queue

    2. fanout 广播是式交换器,不管消息的ROUTING_KEY设置为什么,Exchange都会将消息转发给所有绑定的Queue。

    3. topic 主题交换器,工作方式类似于组播,Exchange会将消息转发和ROUTING_KEY匹配模式相同的所有队列,比如,ROUTING_KEY为user.stock的Message会转发给绑定匹配模式为 * .stock,user.stock, * . * 和#.user.stock.#的队列。( * 表是匹配一个任意词组,#表示匹配0个或多个词组)

    4. headers 消息体的header匹配(ignore)

    queue(队列)

    消息队列,提供了FIFO的处理机制,具有缓存消息的能力。rabbitmq中,队列消息可以设置为持久化,临时或者自动删除。

    1. 设置为持久化的队列,queue中的消息会在server本地硬盘存储一份,防止系统crash,数据丢失
    2. 设置为临时队列,queue中的数据在系统重启之后就会丢失
    3. 设置为自动删除的队列,当不存在用户连接到server,队列中的数据会被自动删除

    Binding(绑定)

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

    client(Producer&Consumer)

    producer指的是消息生产者,consumer消息的消费者。

  • 相关阅读:
    Python 脚本退出
    数组对象从大到小:
    小程序中使用倒计时
    倒计时
    将数字转化为汉字
    turn.js中文API 写一个翻页效果的参数详细解释
    前端数据可视化echarts.js使用指南
    视频及MP3 播放浅析 Jplayer参数详细
    https://blog.csdn.net/cddcj/article/details/52193932
    让一些旧浏览器变牛逼的库 ========兼容性
  • 原文地址:https://www.cnblogs.com/wade-luffy/p/5770578.html
Copyright © 2011-2022 走看看