【RabbitMQ】7(自)、交换机之topic模式

1、之前类型的问题
  • 在上一个小节中,我们改进了日志记录系统,我们没有使用只能进行随意广播的fanout交换机,而是使用了direct交换机,从而有能实现选择性地接收日志
  • 尽管使用direct交换机改进了我们的系统,但是它仍然存在局限性;比方说我们想接收的日志类型有info.base和info.advantage,某个队列只想要info.base的消息,那这个时候direct就办不到了。这个时候只能使用topic类型
2、Topic的要求
  • 发送到类型是topic交换机的消息的routting_key不能随意写,必须满足一定的要求,它必须是一个单词列表,以点号分隔开。这些单词可以是任意单词,比如说:"stock.usd.nyse", "nyse.vmw","quick.orange.rabbit"这种类型的。当然这个单词列表最多不能超过255个字节
  • 在这个规则列表中,其中有两个替换符是大家需要注意的:
    • *(星号)可以代替一个单词
    • #(井号)可以替代零个或多个单词
3、Topic匹配案例
  • 下图绑定关系如下:
    • Q1-->绑定的是中间带orange带3个单词的字符串(*.orange.*)
    • Q2-->绑定的是
      • 最后一个单词是rabbit的3个单词(*.*.rabbit)
      • 第一个单词是lazy的多个单词(lazy.#)
  • 上图是一个队列绑定关系图,我们来看看他们之间数据接收情况是怎么样的
    • quick.orange.rabbit    被队列Q1Q2接收到
    • lazy.orange.elephant  被队列Q1Q2接收到
    • quick.orange.fox         被队列Q1接收到
    • lazy.brown.fox             被队列Q2接收到
    • lazy.pick.rabbit            虽然满足两个绑定但只被队列Q2接收一次
    • quick.brown.fox           不匹配任何绑定不会被任何队列接收到会被丢弃
    • quick.orange.male.rabbit   是四个单词不匹配任何绑定会被丢弃
    • lazy.orange.male.rabbit     是四个单词但是匹配Q2
  • 当队列绑定关系是下列这种情况时需要引起注意
    • 当一个队列绑定键是#,那么这个队列将接收所有数据,这就有点像fanout了
    • 如果队列绑定键当中没有#和*出现,那么该队列绑定类型就是direct了

4、实战


posted @ 2022-06-23 13:18  郭祺迦  阅读(147)  评论(0)    收藏  举报