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.mac
或computer.win
。
路由键还支持通配符来模糊匹配,*
与#
*
匹配一个分隔的单词#
匹配多个或零个分隔的单词
应用举例
Exchange | Routing key | Queues |
---|---|---|
X | *.*.imac | apple |
X | apple.# | 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内部还是有使用。