1 基本概念
Connection
:连接,代表一个socket
连接。Channel
:通道,是多路复用连接中的一条独立的双向数据流通道,消息发布接受订阅都依靠通道完成。Producer
:生产者,发送消息。Consumer
:消费者,接收消息。Queue
:队列,缓存生产者产生的消息并传递给消费者,只有一个消费者能够收到消息。RabbitMQ
中的消息只能存储在队列中。多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊(即轮询)给对各消费者进行处理,而不是每个消费者都收到同样的消息。RabbitMQ
不支持队列层面的广播消费,如果需要广播消费,需要在其上进行 次开发,处理逻辑会变得异常复杂,同时也不建议这么做。Exchange
:交换机,在rabbitmq
中,生产者并不会直接发送消息到queue
,而是将消息发送到exchange
。exchange
并不会缓存消息,但是它能够决定消息是传递给某个特定的queue
,还是传递给多个queue
,还是直接销毁,这个规则rule
是由exchange
的type
定义的。Binding
:绑定,将queue
绑定到exchange
,这样exchange
就知道可以向哪些queue
转发消息了。
2 Exchange的type
根据路由过程不同,exchange
的type
可分为fanout
、direct
、topic
、headers
。
2.1 fanout
广播式交换机。
消息
M
发送到广播式交换机X
上,交换机X
会将消息M
分发给所有绑定到这个交换机X
上的队列Q
,每个队列Q
都会收到消息,类似广播。如果广播式交换机X
没有被任何队列Q
绑定,那么到达交换机X
的消息将被丢弃。
-
这种模式下不需要指定
Routing Key
路由键,就算指定了也会被忽视。 -
一个交换机可以绑定多个队列
queue
,一个queue
可同时与多个exchange
交换机进行绑定。
2.2 direct
直接交换机。
一个队列
Q
通过路由键K
绑定到直接交换机X
,当一个消息M
和路由键K
发送到直接交换机X
上,直接交换机X
会根据路由键K
将消息M
分发到队列Q
,没有匹配到任何路由键的消息将被丢弃。
- 一个队列可以关联多个路由键,一个路由键可以被多个队列关联。
2.3 topic
通配符交换机。
队列
Q
通过Binding Key
绑定到通配符交换机X
,任何发送到交换机X
的消息M
,将会对它的Routing Key
与Binding Key
进行模式匹配,消息将会被转发给匹配的队列Q
,Binding Key
支持#
和*
通配符。
- 生产者发送消息的时候需要指定
Routing Key
,Key
不能是任意自定义的形式,而必须是由.
隔离的一系列word
,Key
最大限制255
字节。 - 同时绑定
Exchange
与Queue
的时候也需要指定Binding Key
,与Routing Key
遵循相同的命名规则,但是可以使用#
和*
通配符。#
表示匹配0
个或多个word
,*
表示匹配1
个word
。- 两个
.
之间是一个word
。
- 如果
Exchange
没有发现能够与Routing Key
模糊匹配的队列Queue
,则消息将会被丢弃。 - 如果
Binding Key
中*
和#
通配符都不存在,则Routing Key
和Binding Key
相等的时候才转发此消息,类似Direct Exchange
;如果Binding Key
中只有#
或者#.#
通配符,则消息全部被转发,类似Fanout Exchange
。
2.4 headers
headers
类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中headers
属性进行匹配。在绑定队列和交换器时指定一组键值对,当发送消息到交换器时,RabbitMQ
会获取到该消息的headers
(也是一个键值对的形式),对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers
类型的交换器性能会很差,而且也不实用,基本上不会看到它的存在。
3 RabbitMQ六种工作模式
RabbitMQ
有五种工作模式:
- 简单队列模式(
Simple Queue
) - 工作队列模式(
Work Queues
) - 发布/订阅模式(
Publish / Subscribe
) - 路由模式(
Routing
) - 主题模式(
Topics
) - RPC模式(
RPC
)