A. JMS 模型
JMS 中定义了点对点和发布订阅两种消息模型,原来以为 AMQP 协议中 direct Exchange 对应点对点模型,topic Exchange 对应发布订阅模型,fanout Exchange 对应简化的发布订阅模型。可学习下来,发现根本不是那么一回事。
实际上,用三种 Exchange 都可以实现点对点与发布订阅模型。
点对点模型:
- direct Exchange:创建队列A,通过任意绑定键绑定到 Exchange,消息发送使用相同的绑定键
- fanout Exchange:创建队列A,绑定到 Exchange
- topic Exchange:创建队列A,通过任意绑定键绑定到 Exchange,消息发送使用相同的绑定键
发布订阅模型:
- direct Exchange:创建多个队列,通过为每个队列设定多个绑定,也能实现相对复杂的发布订阅模型
- fanout Exchange:创建多个队列,绑定到 Exchange,这是简化的发布订阅模型
- topic Exchange:创建多个队列,通过带通配符的绑定键实现复杂而又灵活的发布订阅模型
简而言之,AMQP 不按 JMS 那一套玩法玩。说白了,AMQP 中所有的队列都遵照 JMS 中的点对点模型,发布订阅实质上是通过 Exchange 的逻辑将消息复制到多个队列来实现的。
B. 好文推荐
好的文章,几张图就能让你深入理解一个系统。推荐阅读:http://blog.csdn.net/lizhitao/article/details/47723105
只拿一张图作分析:
这是 RabbitMQ 实现发布订阅的逻辑图。每个订阅组订阅自己感兴趣的消息类型,它从一个独占的队列中获取这些消息。订阅组内部多个消费者共同分担这些消息的处理。消息发布者将消息发送到 Exchange,由 Exchange 负责将每条消息分发到正确的队列中(可能会同时分发到多个队列)。