1 AMQP与RabbitMQ
AMQP是什么
AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议。AMQP消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP历史
2004年,摩根大通和iMatrix开始着手AMQP开放标准的开发;2006年,AMQP规范发布。2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0 发布。
AMQP与RabbitMQ关系
AMQP是一种协议,而RabbitMQ是该协议的一个开源实现。
参考资料来源
官网地址
RabbitMQ对AMQP协议的支持
RabbitMQ基础知识
RabbitMQ与AMQP协议详解
AMQP 0-9-1 Model Explained
2 概念模型
概念模型从概念模型中可以看出,在RabbitMQ中主要有以下几个角色。
- Broker:接收和分发消息的应用,RabbitMQ Server就是Message Broker。
- Virtual Host:出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,当多个不同的用户使用同一个RabbitMQ Server提供的服务时,可以划分出多个Virtual Host,每个用户在自己的Virtual Host创建Exchange、Queue等。
- Connection:Publisher、Consumer和Broker之间的TCP连接。断开连接的操作只会在Client端进行,Broker不会断开连接,除非出现网络故障或broker服务出现问题。
- Channel:如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在Connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个Thread创建单独的Channel进行通讯,Channel之间是完全隔离的,Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。
- Exchange:message到达Broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。
- Queue:消息最终被送到这里等待Consumer取走。一个message可以被同时拷贝到多个queue中。
- Binding:exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到exchange中的查询表中,用于message的分发依据。
- Publisher和Consumer:Publisher和Consumer不属于AMQP中的元素,它们是连接Broker的应用程序,Publisher生产message,Consumer消费message。
3 Exchange 交换机
ExchangeExchange(交换机)是接收生产者消息的一个实体,Exchange获取消息之后,将消息按照对应的规则路由给跟它绑定的Queue中,一共有以下四种类型的Exchange。
Fanout Exchange
Fanout Exchange将消息路由给绑定到它身上的所有队列,而不理会绑定的路由键。如果有多个队列都绑定到某个Fanout Exchange上,Fanout Exchange会将收到的消息的拷贝分别发送给所有连接的队列。
Direct Exchange
Direct Exchange是根据消息携带的路由键(Routing Key)将消息投递给对应绑定键的队列。如果一个Queue按照某个路由键(如my_key)绑定到Direct Exchange上,当Direct Exchange接收到一个携带路由键my_key的消息时,Direct Exchange会将消息路由到该Queue;不携带my_key的消息则不会路由到该Queue。
Direct Exchange
Topic Exchange
前面提到的Direct规则是严格意义上的匹配,换言之Routing Key必须与Binding Key相匹配的时候才将消息传送给Queue,那么Topic这个规则就是模糊匹配,可以通过通配符满足一部分规则就可以传送。它的约定是:
- routing key为一个句点号
.
分隔的字符串,如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit” - binding key与routing key一样也是句点号
.
分隔的字符串 - binding key中可以存在两种特殊字符
*
与#
用于做模糊匹配,其中*
用于匹配一个单词,#
用于匹配多个单词(可以是零个)
Topic Exchange
Headers Exchange
Headers类型的Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。
4 Queue 队列
QueueQueue(队列)RabbitMQ的作用是存储消息,队列的特性是先进先出。上图可以清晰地看到Client A和Client B是生产者,生产者生产消息最终被送到RabbitMQ的内部对象Queue中去,而消费者则是从Queue队列中取出数据。实际生产环境中,我们不会直接向Queue中发送消息,而是把消息发送给Exchange,由Exchange按照规则来决定发送给哪个Queue。
5 Binding与Routing Key
Routing Key
生产者在将消息发送给Exchange的时候,可以通过携带一个Routing Key来指定这个消息的路由规则,Exchange将根据Routing Key来决定把这个消息路由给哪一个Queue。RabbitMQ中Routing Key设定的长度限制为255 bytes。
Binding 绑定
RabbitMQ中通过Binding将Exchange与Queue关联起来,这样RabbitMQ就知道如何正确地将消息路由到指定的Queue了。
Binding Key
在把Exchange与Queue的Binding(绑定)的时候,可以指定一个Binding Key;当生产者将携带对应Routing Key发送给Exchange的时候,Exchange会按照Binding Key与Routing Key的匹配关系,来决定把消息路由到哪一个Queue。
注意事项
- 在绑定多个Queue到同一个Exchange的时候,这些Binding允许使用相同的Binding Key。
- Binding Key并不是在所有情况下都生效,它依赖于Exchange Type。
网友评论