RabbitMQ 知识总结
RabbitMQ知识总结
AMQP协议
三层协议
- Module Layer:决定基本域模型所产生的行为,主要定义了一些供客户端调用的命令,客户端可以利用这些命令实现自己的业务逻辑。
- Session Layer:主要负责将客户端的命令发送给服务器,再将服务端的应答返回给客户端,主要为客户端和服务器之间通信提供可靠性、同步机制和错误处理。
- Transport Layer:主要用于二进制数据流的传输。
RabbitMQ
- Broker:接收和分发消息的应用,像是RabbitMQ、ZeroMQ或者Redis等等。
- Connection:publisher/consumer和Broker之间的TCP连接
- Channel:两个AMQP结点之间双向通信流,通道是多路复用的,因此单个网络连接可以支撑多个通道,各个通道之间是相互隔离的,其极大的减少了操作系统建立多个TCP连接的开销。
- Message:消息
- Exchange:服务器中接收来自生产者程序的消息的实体,并可选择将这些消息路由到服务器中的消息队列中
- Message queue:保存消息并将它们转发给消费者
- Routing key:一个虚拟地址,虚拟机可用它来确定如何路由一个特定消息
交换机
属性
类型
Direct:Message中的routing key 如果和Binding中的 binding key一致的话,则Exchange会将Message散发到对应的Message queue中。
在默认的情况下创建的就是该类型的exchange,通常使用在需要发送消息到具体的队列的情况,比如下面这张图中,最后交换机会将消息路由到名字为green的消息队列中。
Fanout:Exchange会将所有的Message散发到关联的Message queue中。
即便是已经提供了routing key,该类型交换机也会忽略掉,并且将消息发送到所有关联的队列中,通常用来实现发布/订阅模式,比如说体育新闻网站可以用它来近乎实时地将比分更新分发给移动客户端,分发系统使用它来广播各种状态和配置更新等等。
Topic:根据正则表达式将Message散发到匹配的Message queue中。
比如在下图中,根据Routing key
first.green.fast
能够匹配到的队列有.green.
和.*.fast
,该模式主要用来实现消息多播路由。比如说分发有关于特定地理位置的数据,例如销售点,涉及到分类或者标签的新闻更新(例如,针对特定的运动项目或者队伍)等等。Headers:类似于Direct,但是当涉及到多个属性的时候,一个Routing key 无法完全表达,其只能是个字符串,而多属性需要使用到多个键值对表示,因此使用消息属性来代替路由键作为路由规则,通过判断消息头中的值来和队列中的值来确定消息的路由位置。
如果x-match为any的时候, 表示消息头的任意一个值被匹配后就可以满足条件,而当x-match为 all的时候,表示消息头的所有的值都需要被匹配到才能满足条件,比如在下图中,因为第一个队列为any,并且存在匹配的值,所以可以路由到绿色的路由中,因为第三个队列为all,消息头并没有都匹配所有的键值对,因此消息只会发送到绿色的消息队列中。
队列
消息
消息确认
拒绝消息
预取
连接和通道
使用
比较
功能 | RabbitMQ | ZeroMQ |
---|---|---|
消息持久化 | 支持 | 不支持 |
事务 | 支持 | 不支持 |
类似 | 邮箱 | socket |
性能 | 低 | 高 |
稳定性 | 高 | 不稳定 |
支持AMQP协议 | 支持 | 不支持 |
适用场景 | 不允许数据丢失 | 高吞吐 |
关注公众号:数据结构与算法那些事儿,每天一篇数据结构与算法