RabbitMQ 使用的AMQP模型解析

 RabbitMQ 是采用AMQP协议进行通信的。比起简单的TCP/UDP之类的通信,该模型更为复杂,功能也更为强大。

最近项目中用到RabbitMQ比较多,就比较系统深入的过来看看它的具体方式。

内容基本上从官网文档借鉴。


RabbitMQ 使用的AMQP模型解析_第1张图片


在这个模型中,publisher将消息首先发布给Exchange,由Exchange负责发送到一个或多个Queue中,发送的规则称为binging。最后发送给consumer或者consumer来pull。感觉这个概念就像寄送快递,发件人只需要和快递员打交道,告诉要发什么地址,甚至多个地址。派送则由快递公司承担。最后用户既可以选择送货上门,也可以选择自己去取件。

为了保证传递的可靠性,AMQP中有一个确认机制。consumer在收到快递后,要签个字,快递公司才会把订单从系统中撤掉。

如果消息无法送抵,则可以回退给publisher,或者扔掉,或者放入旧货堆(dead letter queue)


exchange:

Exchange作为AMQP中重要的一个中间实体,其交换类型(exchange type), 共有以下4种:

Direct, Fanout, Topic, Headers

除了类型外,还有一些关键的属性:

Name,  Durability, Auto-delete, Arguments.


针对每种类型的具体解释如下:

Default Exchange: 

default exchange是一种直接交换,所使用的exchange是不需要命名的默认exchange(empty string)。它有一个特别之处是在每个queue生成的时候会自动帮定到一个同名的routing key上。这样从默认exchange上出来的消息就可以根据这个routing key自动找到对应的queue。从外界看来,好像exchange不存在,publisher直接将消息写入了queue中。


Fanout Exchange:

fanout exchange 会忽略routing key的作用,向所有与其绑定的queue发送消息。当一条消息从publisher发布到exchange之后,exchange会负责到所有的N个queue中。这是用来做广播的理想方式。

RabbitMQ 使用的AMQP模型解析_第2张图片

Topic Exchange:

topic exchange会分发消息到一个或多个queue上,这取决于routing key和pattern的设置,只有相符合的消息才会被传到queue上。这个模式常用来做多播和订阅模式。


Headers Exchange:

headers exchange 在分发消息的时候,不依赖于routing key的规则,而是直接根据消息的headers attribute.每个queue可以指定一个或多个header,也可以指定是指需要满足一个header还是要所有的header都满足才算是匹配成功。


队列

队列(Queue)也是AMQP中重要的组成部分。它也有一些重要的属性:

Name

Durable(持久化)

Exclusive(只被用于一条连接,连接关闭后自动删除)

Auto-delete(最后一个consumer退订后自动删除)

Arguments

队列在使用之前要先被声明,如果声明一个已存在的队列,则看声明时用到的参数是否一致,不一致时报406错。


用户可以用255位之内的UTF-8字符命名队列,也可以让broker生成一个唯一的名称(在定义时传入空名字),之后使用的时候只要输入空字符串,会自动匹配到这个唯一的名字上。


绑定

在AMQP中,绑定是用来判定exchange向那些队列传递消息的规则。绑定可能会用到一个叫做routing key的属性,这个属性用来订制选择的规则,类似于一个filter的工作方式。


消费者(consumer)

在AMQP中,消费者有两种消费模式:Push和Pull。

在Push方式下,消费者订阅某一个队列,队列的消息就被推送来。

对于消息回执,有两种选择,一种由消费者主动发送回执或者broker自动发送。





你可能感兴趣的:(RabbitMQ)