RabbitMQ官网的消息模型的第五种-Topic
topic交换器
topic(主题)交换器
发送到topic
交换器的消息不能具有随意的routing_key
——它必须是单词列表,以点分隔。这些词可以是任何东西,但通常它们指定与消息相关的某些功能。一些有效的routing_key
示例:“stock.usd.nyse
”,“nyse.vmw
”,
“quick.orange.rabbit
”。routing_key
中可以包含任意多个单词,最多255个字节。
绑定键也必须采用相同的形式。topic
交换器背后的逻辑类似于direct
交换器——用特定路由键发送的消息将传递到所有匹配绑定键绑定的队列。但是,绑定键有两个重要的特殊情况: - *
(星号)可以代替一个单词。 - #
(井号)可以替代零个或多个单词。
Topic
类型的Exchange
与Direct
相比,都是可以根据RoutingKey
把消息路由到不同的队列。只不过Topic
类型Exchange
可以让队列在绑定Routing Key
的时候使用通配符! 这种模型RoutingKey
一般都是一个或多个单词组成,多个单词间以".“分割,例如: item.insert
通配符
-
* (star) can substitute for exactly one word. 匹配不多不少刚好一个词
-
# (hash) can substitute for zero or more words. 匹配0个或多个词
例如:
audit.# 匹配audit.irs.corporate或者audit.irs等
audit.* 只能匹配audit.irs
以上图作为示例,我们将发送一些都是描述动物的信息。将使用包含三个词(两个点)的路由密钥发送消息。路由键中的第一个单词将描述速度,第二个是颜色,第三个是种类:"<speed>.<colour>.<species>
"。
我们创建了三个绑定关系:Q1与绑定键“*.orange.*
”绑定,Q2与“*.*.rabbit
”和“lazy.#
”绑定。
这些绑定可以总结为:
- Q1对所有橙色动物都感兴趣。
- Q2想接收有关兔子(rabbit)的一切消息,以及有关懒惰(lazy)动物的一切消息。
路由键设置为“quick.orange.rabbit
”的消息将传递到两个队列。消息“lazy.orange.elephant
”也将发送给他们两个。另一方面,“quick.orange.fox
”将仅进入第一个队列,而“lazy.brown.fox
”将仅进入第二个队列。即使“lazy.pink.rabbit
”与两个绑定匹配(匹配Q2的两个绑定),也只会传递到第二个队列一次。 “quick.brown.fox
”与任何绑定都不匹配,因此将被丢弃。
如果我们打破约定并发送一个或四个单词的消息,例如“orange
”或“
quick.orange.male.rabbit
”,会发生什么?好吧,这些消息将不匹配任何绑定,并且将会丢失。
另外,“lazy.orange.male.rabbit
”即使有四个单词,也将匹配最后一个绑定,并将其传送到第二个队列。
topic交换器
topic交换器功能强大,可以像其他交换器一样运行。
当队列用“#”作为绑定键绑定时,它将接收所有消息,而与路由键无关,就像在fanout交换器中一样;
当在绑定中不使用特殊字符“
*
”(星号)和“#
”(井号)时,topic交换器的行为就像direct
交换器一样。
完整demo
我们将在日志记录系统中使用topic
交换器。我们将从一个可行的假设开始,即日志的路由键将包含两个词:“<facility>.<severity>
”。
该代码与上一教程中的代码几乎相同。
producer.go
|
|
consumer.go
|
|
想要接收所有的日志:
|
|
要从“kern
”接收所有日志:
|
|
或者,如果你只想接收“critical
”日志:
|
|
你可以创建多个绑定:
|
|
并发出带有路由键“kern.critical
”的日志:
|
|
测试
- rabbitMQ web面板
- 消费者
- 生产者