路由模型rabbitmq 提供了五种不同的通信模型,上一篇文章中,简单的介绍了一下rabbitmq的发布订阅模型模型。这篇文章来学习一下rabbitmq中的路由模型(direct)。
路由模型(direct):路由模式相当于是分布订阅模式的升级版,多了一个 路由key来约束队列与交换机的绑定。
在路由模型中,生产者将消息发送到交换机,交换机根据消息的路由键将消息转发到对应的队列中。每个队列可以绑定多个路由键,每个路由键可以绑定到多个队列中。消费者从队列中接收消息并处理。当一个路由键被多个队列绑定时,交换机会将消息发送到所有绑定的队列中。当一个队列绑定多个路由键时,该队列将能够接收到所有路由键对应的消息。
适用场景路由模型适用于需要点对点通信的场景,例如:
系统监控告警通知;任务分发;用户私信系统;订单确认通知等。演示生产者
// 生产者public class producer { private static final string exchange_name = exchange_direct_1; // 定义路由的key,key值是可以随意定义的 private static final string exchange_routing_key1 = direct_km1; private static final string exchange_routing_key2 = direct_km2; public static void main(string[] args) throws ioexception, timeoutexception { connection connection = connectionutils.getconnection(); channel channel = connection.createchannel(); channel.exchangedeclare(exchange_name, direct); for (int i = 0; i < 100; i++) { if (i % 2 == 0) { channel.basicpublish(exchange_name, exchange_routing_key1, null, (路由模型发送的第 + i + 条信息).getbytes()); } else { channel.basicpublish(exchange_name, exchange_routing_key2, null, (路由模型发送的第 + i + 条信息).getbytes()); } } channel.close(); connection.close(); }}消费者
// 消费者1public class consumer { private static final string queue_name = queue_direct_1; private static final string exchange_name = exchange_direct_1; private static final string exchange_routing_key1 = direct_km1; 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, direct); channel.queuebind(queue_name, exchange_name, exchange_routing_key1); 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_direct_2; private static final string exchange_name = exchange_direct_1; private static final string exchange_routing_key2 = direct_km2; 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, direct); channel.queuebind(queue_name, exchange_name, exchange_routing_key2); 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得到了序号是偶数的消息
消费者2得到了序号是奇数的消息
小结本文介绍了 rabbitmq 通信模型中的路由模型的使用,通过交换机和路由键实现点对点通信,适合于需要点对点通信的场景。在实际使用过程中,需要注意以下几点:
路由键必须要与消费者绑定队列时的路由键相同,否则无法接收到消息;可以通过多个交换机和路由键来实现更灵活的消息路由。
电路板焊盘脱落维修
iPhone XS这款新机,最大的提升是搭载的是A12处理器和后置双摄像头
欣锐科技引进了一个由三台环球仪器Uflex组成的自动化平台
LoRa模块LoRa-CC68和LoRa-CC68-X1的区别
ID发布全球2020年Q3企业存储系统季度季度追踪报告
RabbitMQ中的路由模型(direct)
华为P10的发布:让华为Mate9无路可走?
中国电信终端洞察报告:5G手机SA的性能整体表现成熟稳定
ORC团队引领光学计量学大变革
新一代LED光耦电路设计,改进老化和能耗
出入口控制系统在智慧城市中有什么作用
华为靳玉志:F5G和5G是新基建中新连接中最重要的构成部分
来看看:2016游戏产业将会发生什么?
大数据时代,西部数据的应对之道:创新存储架构
诺基亚8什么时候上市?诺基亚8最新消息汇总:诺基亚8渲染图、外观、配置、价格一探究竟
匝间耐压(层间耐压)测试方法
如何利用Lora实现迷你气象站的设计
小米5C造声势小米6系统成亮点, iphone7Plus遇问题
21.5寸4K iMac拆解大曝光,内部芯片一览!
未来谁将成为Mini LED市场的主导者