首页 > 技术文章 > RabbitMQ理论部分

tianmh 2018-11-27 11:45 原文

概念

queue        队列

exchange   交换机

bind          绑定

channel     通道

一个发送消息流程包含上述四个概念。消息经过channel传递给exchange,exchange根据bind关系将message传递给queue

 附图

 

交换机和交换机类型

 

1 direct 直连类型

队列绑定交换机需要指定routeKey,且发送消息需指定routeKey。

交换机收到消息后会判断routeKey与哪个队列发生直接匹配关系,如果可以关联就会将消息推给指定队列。

 

2 fanout 广播类型

队列绑定无需指定routeKey,发送消息也无需指定routeKey,即使指定也不会生效。

 

3 topic 订阅类型

队列绑定交换机需要指定routeKey,且发送消息需指定routeKey。交换机根据routeKey进行匹配

举例 

队列1   routeKey: #.log.#

队列2   routeKey:#.log.tianmh.succ.#

队列3   routeKey:#.log.tianmh.fail.#

情况1 发送消息到交换机 绑定routeKey: log   可以匹配的队列:队列1

情况2 发送消息到交换机 绑定routeKey: log.tianmh.succ  可以匹配的队列:队列1 队列2

 

4headers 头交换机

有时消息的路由操作会涉及到多个属性,此时使用消息头就比用路由键更容易表达,头交换机(headers exchange)就是为此而生的。头交换机使用多个消息属性来代替路由键建立路由规则。通过判断消息头的值能否与指定的绑定相匹配来确立路由规则。

我们可以绑定一个队列到头交换机上,并给他们之间的绑定使用多个用于匹配的头(header)。这个案例中,消息代理得从应用开发者那儿取到更多一段信息,换句话说,它需要考虑某条消息(message)是需要部分匹配还是全部匹配。上边说的“更多一段消息”就是"x-match"参数。当"x-match"设置为“any”时,消息头的任意一个值被匹配就可以满足条件,而当"x-match"设置为“all”的时候,就需要消息头的所有值都匹配成功。

头交换机可以视为直连交换机的另一种表现形式。头交换机能够像直连交换机一样工作,不同之处在于头交换机的路由规则是建立在头属性值之上,而不是路由键。路由键必须是一个字符串,而头属性值则没有这个约束,它们甚至可以是整数或者哈希值(字典)等。

 

队列

  • Durable(消息代理重启后,队列依旧存在)
  • Exclusive(只被一个连接(connection)使用,而且当连接关闭后队列即被删除)
  • Auto-delete(当最后一个消费者退订后即被删除)
  • Arguments(一些消息代理用他来完成类似与TTL的某些额外功能)

 

推荐阅读