[RabbitMQ] RabbitMQ 工作模式介绍

RabbitMQ 是现在很常用的一个消息服务中间件, 通过不同类型的交换机(Exchange) 和不同的路由键(RoutingKey) , 可以实现不同分发策略, 灵活地将消息分发到不同的队列中去.
[RabbitMQ] RabbitMQ 工作模式介绍生产者(Producer)先将消息发送到交换机, 交换机根据事先设置好的分发策略, 将消息分发到不同的队列中, 消费者从指定队列中获取消息.

生产者需要关注交换机(名称和类型), 路由键, 而消费者只需要关注队列.

在 RabbitMQ 中, 每个队列中的消息都只会被消费一次, 如果需要将同一条消息被多个消费者消费多次, 可以通过合适的交换机, 将同一条消息投递到多个不同的队列中, 形成多个消息副本提供给不同的消费者.

1. 简单模式 Simple

不需要指定交换机, 生产者直接通过队列名发送消息, 消费者也直接通过队列名获取消息.

[RabbitMQ] RabbitMQ 工作模式介绍
[RabbitMQ] RabbitMQ 工作模式介绍

2. 路由模式 Routing

[RabbitMQ] RabbitMQ 工作模式介绍需要声明一个直连交换机(Direct Exchange), 并通过路由键(RoutingKey)将一个队列绑定到直连交换机.

  • 允许多重绑定: 将同一队列不同的路由键与交换机绑定
  • 允许重复绑定: 将多个队列相同的路由键与交换机绑定, 会创建多个消息副本

[RabbitMQ] RabbitMQ 工作模式介绍
当消息到达直连交换机时, 会根据消息中携带的路由键, 查找绑定的队列:

  • 若交换机上有通过该路由键绑定的队列, 将消息投递到该队列
  • 若交换机上没有通过该路由键绑定的队列, 则消息会被丢弃

3. 发布/订阅 Pub/Sub

需要声明一个扇形交换机(Fanout Exchange), 并将多个队列绑定到该交换机上.

扇形交换机上绑定队列时不需要指定路由键(指定了也会被忽略), 到达扇形交换机的消息将会被投递到该交换机的所有队列中.

[RabbitMQ] RabbitMQ 工作模式介绍[RabbitMQ] RabbitMQ 工作模式介绍

4. 主题模式 Topics

[RabbitMQ] RabbitMQ 工作模式介绍主题交换机与直连交换机类似, 都需要在绑定队列时指定路由键, 到达交换机的消息会根据路由键投递到不同的队列.

但区别在于直连交换机使用的是精确匹配的路由键, 而主题交换机则允许使用通配符进行模糊匹配.

主题交换机绑定队列的key是一个匹配表达式, 以句点.为分隔符, *匹配一个词, #匹配任意多个词, 如

  • usa.*: 仅匹配形如 usa.x 的key, 忽略 usa.x.y, usa.x.y.z 等key
  • china.#: 匹配形如 china.x, china.x.y, china.x.y.z 等key
  • *.news: 仅匹配形如 x.news 的key, 忽略 x.y.news, x.y.z.news 等key
  • #.weather: 匹配形如 x.weather, x.y.weather, x.y.z.weather 等key

比如一个生产者以usa.news为路由键发送消息到主题交换机, 则该消息会被投递到 usa.*#.news 两个队列
[RabbitMQ] RabbitMQ 工作模式介绍