RabbitMQ (三) 消息订阅模式

一、广播模式(fanout)

  • 交换机(Exchange)收到的消息发送给所有绑定了该交换机的队列,忽略路由(RoutingKey)
  • 这种模式下,消息会被所有消费者消费。也就是说,只要是"绑定"到某个交换机的队列,都会收到生产者发送到该交换机的消息

RabbitMQ (三) 消息订阅模式

二、路由模式(direct)

  • 生产者发送信息时,需要指定一个路由(RoutingKey)交换机(Exchange)会根据路由将消息发送到绑定了此路由的队列中

RabbitMQ (三) 消息订阅模式

三、主题模式(topic)

  • 在实际的运用中,广播模式(fanout)路由模式(direct)虽然功能能支持一定场景,但是任然有一定的局限性,比如不能根据多重条件来进行路由选择
  • 发送给主题模式交换机的信息不能是任意设置的选择键,必须是用小数点隔开的一系列的标识符,标识符可以随意填充,但是一般是与某些特征相关联。
  • 选择键不能超过255个字符。合法的键比如"vip.user.order",“common.user.pay”。
    绑定键必须以相同的格式,特殊情况:"*" (星号)可以代替任意一个标识符;"#"(井号)可以代替0个或多个标识符。

RabbitMQ (三) 消息订阅模式

队列1绑定"*.user.*",表示其只关注用户相关的消息。

队列2绑定"*.*.order",表示其只关注订单相关的消息。

队列3绑定"svip.#",表示其只关注svip用户相关的消息。

当发送消息指定"vip.user.order"时,因为队列1与队列2能匹配,所以会被发送到队列1、2中。

如果发送信息为"common.user.pay"时,就只有队列1能匹配,且将消息发送到队列1。

但是如果我们违反约定,发送了只带1个或者4个表示符的选择键,那交换机将会怎样去处理呢?

当发送消息选择键为"test"时,所有队列都选择键因为不满足自己的匹配规则而不接受,此时消息丢弃。

当发送消息选择键为"test.test1.test2.order"时,尽管有四个标识符,但是能被队列2的规则匹配。

  • 主题模式的转发器非常强大,可以实现广播模式(fanout)路由模式(direct)的功能。当队列绑定#选择键时,相当于广播模式(fanout)。当特殊字符#和*不包含在选择键中时,就相当于路由模式(direct)模式。