rabbitmq 操作库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

topic_exchange.md 2.5 KiB

2 years ago
123456789101112131415161718192021222324252627282930313233
  1. ## Topic类型的exchange
  2. - direct是全值匹配,那么topic就可以部分匹配,又可以全值匹配,比direct更加灵活。
  3. 消息发送到topic类型的exchange上时不能随意指定routing_key(一定是指由一系列由点号连接单词的字符串,单词可以是任意的,但一般都会与消息或多或少的有些关联)。 Routing key的长度不能超过255个字节。
  4. Binding key也一定要是同样的方式。Topic类型的exchange就像一个直接的交换:一个由生产者指定了确定routing key的消息将会被推送给所有Binding key能与之匹配的消费者。然而这种绑定有两种特殊的情况:
  5. * (星号):可以(只能)匹配一个单词
  6. * #(井号):可以匹配多个单词(或者零个)
  7. * 举例说明:如下图
  8. ![image-20220113153420444](../images/md/topic.jpg)
  9. 在这个例子中,我们将会发送一些描述动物的消息。Routing key的第一个单词是描述速度的,第二个单词是描述颜色的,第三个是描述物种的:“<speed>.<colour>.<species>”。
  10. 这里我们创建三个Binding:Binding key为”*.orange.*”的Q1,和binding key为”*.*.rabbit”和”lazy.#”的Q2。
  11. 这些binding可以总结为:
  12. - Q1对所有橘色的(orange)的动物感兴趣;
  13. - Q2希望能拿到所有兔子的(rabbit)信息,还有比较懒惰的(lazy.#)动物信息。
  14. 一条以” quick.orange.rabbit”为routing key的消息将会推送到Q1和Q2两个queue上,routing key为“lazy.orange.elephant”的消息同样会被推送到Q1和Q2上。但如果routing key为”quick.orange.fox”的话,消息只会被推送到Q1上;routing key为”lazy.brown.fox”的消息会被推送到Q2上,routing key为"lazy.pink.rabbit”的消息也会被推送到Q2上,但同一条消息只会被推送到Q2上一次。
  15. 如果在发送消息时所指定的exchange和routing key在消费者端没有对应的exchange和binding key与之绑定的话,那么这条消息将会被丢弃掉。例如:"orange"和"quick.orange.male.rabbit"。但是routing为”lazy.orange.male.rabbit”的消息,将会被推到Q2上。
  16. Topic类型的exchange:
  17. ------
  18. Topic类型的exchange是很强大的,也可以实现其它类型的exchange。
  19. - 当一个队列被绑定为binding key为”#”时,它将会接收所有的消息,此时和fanout类型的exchange很像。
  20. - 当binding key不包含”*”和”#”时,这时候就很像direct类型的exchange。