相关概念
队列服务,一般涉及到三个概念:生产者、队列、消费者;RabbitMQ在生产者和队列之间加入了交换器(Exchange)
便于交互;避免生产者与队列的直接交互,而是生产者发送消息给交换器,交换器根据调度策略给队列。
- 上图中 P 代表生产者;
- 中间是 RabbitMQ 包括交换机 和 队列;
- 上图中 C 代表消费者;
在RabbitMQ中比较重要的四个概念:虚拟主机、交换机、队列、绑定
- 虚拟主机:一个虚拟主机持有一组交换机、队列和绑定;可以有多个虚拟主机的原因是因为:在RabbitMQ中,用户只能在虚拟主机的粒度进行权限控制。因此,如果需要禁止A组访问B组的交换机/队列/绑定,必须为A和B分别创建一个虚拟主机。每一个RabbitMQ服务器都有一个默认的虚拟主机“/”。
- 交换机(Exchange):用于转发消息,不做存储;如果没有 Queue bind 到 Exchange 的话,会直接丢弃掉 Producer 发送的消息。交换机中还有一个重要的东西:
路由键
,交换机发送到指定的队列,需要根据路由键来转发。 - 绑定:交换机和队列需要绑定,如上图所示为多对多关系。
详细讲解
交换机
交换机有四种类型:Direct,Topic,Headers and Fanout
- Direct:’先匹配,再投送’。在绑定是设置一个
routing_key
,消息的routing_key
匹配时,才会被投送到绑定的队列中去。 - Topic:按自定义规则转发消息。
- Headers:设置header attribute参数类型的交换机。
- Fanout:转发消息到所有绑定队列。
Direct Exchange
Direct Exchange是RabbitMQ默认的交换机模式,根据key去匹配寻找队列。
如图,X-Q1有一个 routing_key 为 orange;X-Q2有两个 routing_key 为 black、green;Q1接收 orange 的消息,Q2接收 black 和 green 的消息。
Topic Exchange
转发消息主要根据通配符。这种交换机下,队列和交换机的绑定会定义一种路由模式,通配符在这种路由模式和路由键之间匹配后交换机才能转发消息。
这种模式下:
- 路由键必须是一串字符,字符之间用 英文状态的句号隔开
(.)
,比如spring官网的RabbitMQ例子中的 routing_key –foo.bar.#
- 路由键必须包含一个
*
或者#
。主要用于匹配路由键指定位置的单词,可以使用两个通配符*
:指定位置的一个单词#
:指定位置的零个或多个单词
Headers Exchange
这个模式也是根据规则匹配,相较于Direct 和 Topic 固定的使用 routing_key , Headers是一个自定义匹配规则的类型。在交换器与队列绑定时,会设定一组键值对规则,消息中也包括一组键值对(Headers 属性 ),这些键值对有一对或者全部匹配时,消息就会被投送到对应的队列。
Fanout Exchange
广播消息,不管路由模式或者路由键,会把消息投送给绑定的全部队列,即使配置了 routing_key 也会被忽略。