Topic 模型的使用

rabbitmq 是一个流行的开源消息队列软件,它提供了多种通信模型,例如发布/订阅模型、路由模型、work模型等。在前面的文章中我们已经介绍了前四种模型,本文将会学习 rabbitmq 中的 topic 模型;接下来还会有关于rabbitmq的系列教程,对你有帮助的话记得关注哦~
topic 模型topic 模型是 rabbitmq 的高级模型之一,topic 模型使用了通配符的概念,可以匹配更灵活的路由规则。topic模式相当于是对路由模式的一个升级,topic模式主要就是在匹配的规则上可以实现模糊匹配。
在 topic 模型中,生产者将消息发送到交换机,交换机根据消息的 routing key 将消息转发到对应的队列中。与 direct 模型不同的是,topic 模型中 routing key 支持通配符匹配,其中 ' ' 可以匹配一个单词,'#' 可以匹配多个单词。例如,order. 可以匹配 order.create,order.delete 等消息,而 order.# 可以匹配 order.create.one,order.delete.two 等消息。
适用场景topic 模型适用于需要灵活的消息路由规则的场景,例如:
新闻网站订阅分类消息;电商网站订阅商品分类消息;金融机构订阅股票市场消息等。演示生产者
// 生产者public class producer { private static final string exchange_name = exchange_topic_1; private static final string exchange_routing_key1 = topic.km; private static final string exchange_routing_key2 = topic.km.001; public static void main(string[] args) throws ioexception, timeoutexception { connection connection = connectionutils.getconnection(); channel channel = connection.createchannel(); channel.exchangedeclare(exchange_name, topic); for (int i = 0; i < 100; i++) { // topic在路由模型的基础上,只有路由的key发生改变,其余的都不变 if (i % 2 == 0) { channel.basicpublish(exchange_name, exchange_routing_key1, messageproperties.persistent_text_plain, (topic模型发送的第 + i + 条信息).getbytes()); } else { channel.basicpublish(exchange_name, exchange_routing_key2, messageproperties.persistent_text_plain, (topic模型发送的第 + i + 条信息).getbytes()); } } channel.close(); connection.close(); }}消费者
// 消费者1public class consumer1 { private static final string queue_name = queue_topic_1; private static final string exchange_name = exchange_topic_1; private static final string exchange_routing_key = topic.*; public static void main(string[] args) throws ioexception, timeoutexception { connection connection = connectionutils.getconnection(); channel channel = connection.createchannel(); channel.queuedeclare(queue_name, false, false, false, null); channel.exchangedeclare(exchange_name, topic); channel.queuebind(queue_name, exchange_name, exchange_routing_key); defaultconsumer defaultconsumer = new defaultconsumer(channel) { @override public void handledelivery(string consumertag, envelope envelope, amqp.basicproperties properties, byte[] body) throws ioexception { system.out.println(消费者1接收到的消息是: + new string(body)); } }; channel.basicconsume(queue_name, true, defaultconsumer); }}// 消费者2public class consumer2 { private static final string queue_name = queue_topic_2; private static final string exchange_name = exchange_topic_1; private static final string exchange_routing_key = topic.#; public static void main(string[] args) throws ioexception, timeoutexception { connection connection = connectionutils.getconnection(); channel channel = connection.createchannel(); channel.queuedeclare(queue_name, false, false, false, null); channel.exchangedeclare(exchange_name, topic); channel.queuebind(queue_name, exchange_name, exchange_routing_key); defaultconsumer defaultconsumer = new defaultconsumer(channel) { @override public void handledelivery(string consumertag, envelope envelope, amqp.basicproperties properties, byte[] body) throws ioexception { system.out.println(消费者2接收到的消息是: + new string(body)); } }; channel.basicconsume(queue_name, true, defaultconsumer); }}测试
先启动2个消费者,再启动生产者
消费者1订阅的是 order.* 的消息,消费者2订阅的是 order.# 的消息,可以得到以下结果:
消费者1接收到的消息是:topic 模型发送的偶数条消息
消费者2接收到的消息是:topic 模型发送的全部消息
小结本文介绍了 rabbitmq 通信模型中的 topic 模型的使用,通过交换机和 routing key 实现更灵活的消息路由。在实际使用过程中,需要注意以下几点:
路由键的格式应该是多个单词组成,用 '.' 分隔;'#' 匹配多个单词,'*' 匹配一个单词;一个队列可以绑定多个 routing key;如果交换机没有匹配到任何一个队列,则会抛弃该消息。

BackBlaze硬盘总容量达到1EB,由多达12.5万块组成
电机与电气控制技术的60个知识点
AMD的7nm锐龙APU核显性能飞跃,最多拥有15组CU单元
苹果和三星王者争雄 国产手机赚钱难 华为也不例外
我国人工智能领域专利申请呈快速增长 其中百度遥遥领先
Topic 模型的使用
AI预测是否能百分百信任?
基于FPGA的数字电压表的设计
SAR/MTI雷达在无人机(UAV)中的作用
LG Innotek的LED部门重组,专注于光学解决方案和基板材料业务
什么是大屏幕投影拼接墙/边缘融合技术
人际大脑同步在社会互动学习中的作用机制
蓝宝石在化学机械抛光过程中的材料去除机理
光荣登榜 — 莫之比入围《2023年长沙市技术创新中心(产业引导类)拟备案名单》
基于一种可控的LED照明驱动系统设计
半导体封装:键合铜丝的性能优势与主要应用问题
全屏幕手机与生物识别技术正成为手机的创新技术点之一
情人节送什么礼物给女生比较好?好看耐用的蓝牙耳机推荐
爱思强MOCVD系统获艾迈斯欧司朗认证,助力加快Micro LED量产
力度十足的低音炮LM3886