RabbitMQ 消息队列:浅谈

简介

消息队列用来解决不同项目间通信、业务解耦。消息队列有很多种比如用Redis实现的轻量级消息队列。RabbitMQ是消息队列的一种,基于AMQP协议,用Erlang语言编写,属于一种消息队列中间件。

消息机制

Connection 链接

真实的TCP链接

Channel 信道

基于Connection创建的Channel,所有的数据传输都是基于Channel的。大家都知道TCP链接需要三次握手,业务频繁每次开TCP链接对性能也会有不小的损耗,TCP链接数也有限制。Channel的存在主要是为了复用TCP链接。

Exchange 交换机

消息生产者生产的所有消息都会先写入Exchange中,再路由到Queues中,如果Exchange没有绑定或未匹配到Queues则消息会被丢弃。

Queues 队列

生产者生产的消息会从Exchange中路由到Queues中,消费者从Queues中消费消息。

Binding 绑定

Binding将Exchange与Queues关联起来。

Routing key 路由键

路由键是消息从Exchange进入到某个Queues的规则。
在将Queues绑定至Exchange时会设置消息从Exchange路由至Queues的绑定路由键规则。
在将消息写入Exchange时会附带消息的路由键。

Exchange类型为direct或topic时,消息的投递会根据消息的路由键和绑定的路由键进行匹配,Exchange将消息投递给所有匹配上的Queues。

路由键写法

路由键可以由. 进行分隔,如computer.maccomputer.win
路由键还支持通配符来模糊匹配,*#
*匹配一个分隔的单词
#匹配多个或零个分隔的单词

应用举例

ExchangeRouting keyQueues
X*.*.imacapple
Xapple.#apple
X*.phone.*phone

此时写入一条消息路由键为apple.phone.iphone4会被投递到队列apple与phone。
再写入一条消息路由键为apple.computer.imac仅会被投递到apple,此时apple队列匹配了两个路由键,但是也只会投递到apple一次。
再写入一条消息路由键为micro.computer.win因为没有匹配的路由键队列该消息会被丢弃。

Exchange Types 交换机类型

fanout 广播

fanout类型的Exchange会无视路由键,将消息投递给所有绑定到该Exchange上的Queues。

direct 单播

direct类型的Exchange会将消息投递给路由键完全匹配的Queues中。

topic 组播

topic类型的Exchange会将消息投递给路由键模糊匹配的Queues中。

headers

headers类型的Exchange也会无视路由键,会根据headers中的属性来进行匹配。该类型应用较少,不过在RabbitMQ内部还是有使用。