0


RabbitMq:Topic exchange(主题交换机)的理解和使用

RabbitMq:Topic exchange(主题交换机)的理解和使用

在RabbitMq中,生产者的消息都是通过交换机来接收,然后再从交换机分发到不同的队列中去,在分发的过程中交换机类型会影响分发的逻辑,下面主要讲解一下主题交换机。

​ 主题交换机核心是可以以范围的行为向队列发送消息,它和直连交换机区别在于,直连交换机一个队列通过一个binding_key和交换机的进行绑定,只能接受一中消息;主题交换机可以按照一定的匹配规则去匹配多个

routing_key

那匹配规则是什么?

交换机和队列的

binding_key

需要采用

*.#.*.....

的格式,每个单词用

.

作为分隔符,其中:

  • *表示一个单词(必须出现的)
  • ##(井号)用来表示任意数量单词(零个或多个)

例如:假设有一条消息的

routing_key

topic.china.shanghai

,另一条为

topic.china

,那么

binding_key

topic.#

的队列这两条消息都会收到

通俗理解:

​ 主题交换机的流程,相当于报纸订阅。有一个总报社

(相当于生产者)

发出各种类型的报纸到各个分报社,分报社相当于不同的

交换机

,每种类型报纸相当于不同的

routing_key

,再往下有卖报点去分报社去报纸,但每个卖报点根据消费者的需求所需要的类型不一样。比如一个分报社手里有两种类型的报纸:

新闻.经济

新闻.体育

。这时三个卖报点来取报纸,卖家A只需要

新闻经济类

,那他跟交换机的binding_key就是

新闻.经济

;卖家B只需要

新闻体育类

,那他的binding_key就是

新闻.体育

;而卖家C这很多消费者都在他这买报纸,他既需要

新闻经济类

又需要

新闻体育类

,他的binding_key相当于是

新闻.#

,新闻下面的都收。

​ 而直连交换机是什么,相当于更小的分销商,针对更精确的人群。他不能像上面那种情况把新闻下所有类都收了,只能一对一的关系,有人需要

新闻.经济

就绑定上,只去收

新闻.经济

报,不能多拿,再有人需要

新闻.体育

才能再收体育报。

下面通过代码演示下主题交换机

  • 创建交换机、队列、绑定关系@ConfigurationpublicclassTopicRabbitConfig{@BeanpublicQueuefirstQueue(){returnnewQueue("topic.shanghai",true,false,false);}@BeanpublicQueuesecondQueue(){returnnewQueue("topic.beijing",true,false,false);}@BeanpublicQueuethirdQueue(){returnnewQueue("topic.china.beijing",true,false,false);}@BeanpublicTopicExchangetopicExchange(){returnnewTopicExchange("topicExchange",true,false);}/** * 交换机和队列绑定,并设置绑定key */@BeanBindingfirstBinding(){returnBindingBuilder.bind(firstQueue()).to(topicExchange()).with("topic.shanghai");}@BeanBindingsecondBinding(){//只要是消息携带的路由键是以topic.开头,后面还更有一个单词的都会分发到该队列returnBindingBuilder.bind(secondQueue()).to(topicExchange()).with("topic.*");}@BeanBindingthirdBinding(){//只要是消息携带的路由键是以topic.开头,都会分发到该队列returnBindingBuilder.bind(thirdQueue()).to(topicExchange()).with("topic.#");}}可以看到已经创建成功

在这里插入图片描述

在这里插入图片描述

  • 分别给交换机按三个不同routing_key发送消息,对应的routing_key分别为:topic.shanghaitopic.haha.hehetopic.test``````@PostMapping("/sendMessageByTopic")publicAjaxResultsendMessageByTopic(@RequestBodyMap params){String id =UUID.randomUUID().toString();String createTime =LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); params.put("messageId",id); params.put("createTime",createTime);/** * 发给交换机,通过匹配队列和交换机绑定关系值,判断发送给哪个队列 */ rabbitTemplate.convertAndSend("topicExchange","topic.shanghai",params); rabbitTemplate.convertAndSend("topicExchange","topic.haha.hehe",params); rabbitTemplate.convertAndSend("topicExchange","topic.test",params);returnAjaxResult.success("成功");}三个队列分别对应的匹配规则及接受到消息的结果如图:在这里插入图片描述 可以看到topic.shanghai队列只能匹配一条,topic.china.beijing队列因为binding_key是topic.#所以全部匹配,topic.beijing队列因为binding_key是topic.*,所以匹配了topic后面只跟一个单词的。

监听就不细说了,跟交换机类型关系不大,主要根据队列名称去监听,实例可以看https://blog.csdn.net/qq_43331014/article/details/132255631第六节-消费者接收消息。


本文转载自: https://blog.csdn.net/qq_43331014/article/details/132331465
版权归原作者 猪大侠0.0 所有, 如有侵权,请联系我们删除。

“RabbitMq:Topic exchange(主题交换机)的理解和使用”的评论:

还没有评论