rabbitmq

RabbitMQ官网arrow-up-right

RabbitMQ 中,出现了六种消息传播模式:

  1. Simple Work Queue (简单工作队列):也就是常说的点对点模式,一条消息由一个消费者进行消费。(当有多个消费者时,默认使用轮训机制把消息分配给消费者)。

  2. Work Queues (工作队列):也叫公平队列,能者多劳的消息队列模型。队列必须接收到来自消费者的 手动ack 才可以继续往消费者发送消息。

  3. Publish/Subscribe (发布订阅模式):一条消息被多个消费者消费。

  4. Routing(路由模式):有选择的接收消息。

  5. Topics (主题模式):通过一定的规则来选择性的接收消息

  6. RPC 模式:发布者发布消息,并且通过 RPC 方式等待结果。目前这个应该场景少,而且代码也较为复杂,本章不做细讲。

注意:官网最后有 Publisher Confirms 为消息确认机制。指的是生产者如何发送可靠的消息。

RabbitMQ的四种Exchange

在了解这些消息模式的时候,引入了一个概念 Exchange(交换机): 在发布订阅里面有对这个概念做解释:

RabbitMQ消息传递模型中的核心思想是生产者从不将任何消息直接发送到队列。实际上,生产者经常甚至根本不知道是否将消息传递到任何队列。 相反,生产者只能将消息发送到交换机。交流是一件非常简单的事情。一方面,它接收来自生产者的消息,另一方面,将它们推入队列。交易所必须确切知道如何处理收到的消息。是否应将其附加到特定队列?是否应该将其附加到许多队列中?还是应该丢弃它。规则由交换机类型定义 。

而 Exchange 的类型有下面四种:

  • direct(直连交换机):将队列绑定到交换机,消息的 routeKey 需要与队列绑定的 routeKey 相同。

  • fanout (扇形交换机):不处理 routeKey ,直接把消息转发到与其绑定的所有队列中。

  • topic(主题交换机):根据一定的规则,根据 routeKey 把消息转发到符合规则的队列中,其中 # 用于匹配符合一个或者多个词(范围更广), * 用于匹配一个词。

  • headers (头部交换机):根据消息的 headers 转发消息而不是根据 routeKey 来转发消息, 其中 header 是一个 Map,也就意味着不仅可以匹配字符串类型,也可以匹配其他类型数据。 规则可以分为所有键值对匹配或者单一键值对匹配。

消息模式
交换机

Simple Work Queue (简单工作队列),Work Queues (工作队列)

空交换机

Publish/Subscribe (发布订阅模式)

fanout (扇形交换机)

Routing(路由模式)

direct (直连交换机)

Topics(主题模式)

topic(主题交换机)

一、 Simple Work Queue (简单工作队列)

1. Sending

file

2. Receiving

二、Work Queue (工作队列)

三、Publish/Subscribe (发布订阅模式)

生产者生产消息到交换机,生产者并不与队列交流。队列由消费者根据交换机创建出来并绑定到交换机。

四、Routing(路由模式)

五、Topics (主题模式)

  • *可以代替一个单词

  • #可以代替零个或多个单词

在此示例中,我们将发送所有描述动物的消息。将使用包含三个词的路由密钥发送消息。路由键中的第一个单词将描述速度,第二个描述颜色,第三个描述物种:".." Q1与".orange."绑定,Q2与"..rabbit"和"lazy.#"绑定。

  • Q1对所有橙色动物都感兴趣

  • Q2关注兔子的一切和速度慢的动物的一切

远程过程调用Remote procedure call (RPC)

我们的RPC将像这样工作:

  • 客户端启动时,它将创建一个匿名排他回调队列。

  • 对于RPC请求,客户端发送一条消息,该消息具有两个属性: reply_to(设置为回调队列)和correlation_id(设置为每个请求的唯一值)。

  • 该请求被发送到rpc_queue队列。

  • RPC工作程序(又名:服务器)正在等待该队列上的请求。出现请求时,它将使用reply_to字段中的队列来完成工作,并将消息和结果发送回客户端。

  • 客户端等待回调队列上的数据。出现消息时,它将检查correlation_id属性。如果它与请求中的值匹配,则将响应返回给应用程序。

最后更新于