RabbitMQ

First Post:

Last Update:

工作流程

1
2
3
4
graph LR

exchanger[交换机] -.-路由键-.-> queue[队列]
queue --绑定键--> exchanger
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

graph LR
subgraph one
producer1((生产者1))
producer2((生产者2))
producer3((生产者3))
end

producer1 --路由键--> exchanger1
producer2 --路由键--> exchanger2
producer3 --路由键--> exchanger1

subgraph RabbitMQ Broker
exchanger1[交换机1] --> queue1
exchanger1[交换机1] --> queue3
exchanger2[交换机2] --> queue2
exchanger2[交换机2] --> queue4
end


queue1[队列1] --> consumer1
queue2[队列2] --> consumer2
queue3[队列3] --> consumer1
queue4[队列4] --> consumer1

subgraph 消费者
consumer1((消费者1))
consumer2((消费者2))
end

RabbitMQ Broker: 消息中间件的服务节点

信息交换机类型

  • 定义
  • 优缺点
  • 适用场景
  • 如何应用

Fanout(扇形)交换机

就像交换机一样, 广播消息

  • 将所有信息绑定到消息队列
  • 与该交互机绑定的, 都会收到其交货机的广播消息

定义

Fanout 交换机将消息广播到与其绑定的所有队列。无视消息的路由键,适合广播消息的场景。

优缺点

  • 优点

    可以将消息广播到所有与之绑定的队列,适用于需要广播消息的场景,比如日志系统、发布订阅系统等

  • 缺点

    不能进行精确的路由控制,不适用于需要特定路由规则的场景

适用场景

举例:
例如,在一个多播聊天室中,当一个用户发送一条消息时,所有其他用户都应该接收到这条消息。在这种情况下,可以使用 Fanout 交换机将消息广播到所有与之绑定的队列中


Topic(主题)交换机

定义

Topic 交换机根据消息的路由键将消息路由到与之匹配的队列中。路由键可以使用通配符进行匹配,适合处理一对多的消息发送场景。

优缺点

  • 优点

    可以根据消息的路由键进行精确的路由控制,只将消息发送到与之完全匹配的队列中,适用于需要一对一的消息发送场景

  • 缺点

    路由键只能使用固定的字符串,不支持通配符匹配

适用场景

举例:
例如,在一个电商系统中,当一个用户购买一件商品时,需要根据商品的类别和品牌将订单信息发送到特定的队列中,以便相关的部门进行处理。在这种情况下,可以使用 Topic 交换机根据商品的类别和品牌进行多重路由控制,将订单消息发送到特定的队列中


Direct(直连)交换机

定义

Direct 交换机根据消息的路由键将消息路由到与之完全匹配的队列中。适合处理一对一的消息发送场景

优缺点

  • 优点

    支持通配符匹配路由键,可以根据消息的路由键将消息路由到多个队列中,适用于需要一对多的消息发送场景

  • 缺点

    相比直连交换机,Topic 交换机在处理消息时需要进行额外的匹配操作,处理效率略低

适用场景

举例:
例如,在一个订单系统中,当一个订单创建时,需要将订单信息发送到一个特定的队列中,以便其他系统可以及时地处理这个订单。在这种情况下,可以使用 Direct 交换机根据订单号进行路由控制,将订单消息发送到特定的队列中


路由键

在 RabbitMQ 中,路由键是一个字符串,用于描述消息的路由信息。生产者在发送消息时可以指定路由键,消费者在绑定队列时也可以指定路由键。

路由键与交换机的绑定方式不同,对于 Fanout 交换机来说,路由键会被忽略,消息会被广播到所有绑定到交换机上的队列中;对于 Direct 交换机和 Topic 交换机来说,路由键决定了消息被路由到哪个队列中。

在 Direct 交换机和 Topic 交换机中,队列和交换机之间的绑定都是带有一个路由键的,当生产者发送消息时,需要指定消息的路由键,交换机会根据路由键将消息发送到对应的队列中。

在 Topic 交换机中,路由键可以使用通配符来进行匹配。通配符有两种,分别是 *(匹配一个单词)和 #(匹配零个或多个单词),可以使用它们来实现更加灵活的路由控制。

sg.#

sg.slx
sg.xh