rabbitmq3.7.3 发布了一个新的 exchange x-random
direct exchange 同一个 routing key 可以绑定多个 queue,当给这个routing key发消息时,所有 queue 都会投递。这个行为对于一些场景不适用,有时我们希望只有一个 queue 收到消息。x-random 就是解决这个问题的。
这个 exchange 之前是第三方实现的,现在在官方给的 3.7.3(2018-01-30发布) 已经自带了,但仍需要人工激活。升级 rabbitmq-server 后手工执行:
rabbitmq-plugins enable rabbitmq_random_exchange
激活后在 web console 就可以看到这种 exchange 了:

测试:
import asyncio
import traceback import asynqp async def test(case_id): def listen(id):
def callback(msg):
print('[{}] [{}] Received: {}'.format(case_id, id, msg.body))
msg.ack()
return callback try:
connection = await asynqp.connect('localhost', 5672, username='guest', password='guest')
channel = await connection.open_channel()
exchange = await channel.declare_exchange('rnd.exchange', 'x-random') for i in range(0,10):
queue = await channel.declare_queue('test.queue_%s' % i)
await queue.bind(exchange, 'routing.key')
await queue.consume(listen(i)) async def send_msg():
for i in range(0, 50):
msg = asynqp.Message({'hello': '%s world %s, random exchange'%(case_id, i)})
exchange.publish(msg, 'test.queue')
await asyncio.sleep(1) asyncio.ensure_future(send_msg()) except Exception as ex:
traceback.print_exc() if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait([test('A'), asyncio.sleep(10)]))
效果:
[A] [5] Received: b'{"hello": "A world 0, random exchange"}'
[A] [6] Received: b'{"hello": "A world 1, random exchange"}'
[A] [1] Received: b'{"hello": "A world 2, random exchange"}'
[A] [8] Received: b'{"hello": "A world 3, random exchange"}'
[A] [3] Received: b'{"hello": "A world 4, random exchange"}'
[A] [4] Received: b'{"hello": "A world 5, random exchange"}'
[A] [6] Received: b'{"hello": "A world 6, random exchange"}'
[A] [8] Received: b'{"hello": "A world 7, random exchange"}'
[A] [5] Received: b'{"hello": "A world 8, random exchange"}'
[A] [2] Received: b'{"hello": "A world 9, random exchange"}'
可见消息会投递到随机选择的某个 queue。
random-exchange 的代码:https://github.com/rabbitmq/rabbitmq-random-exchange
注意:publish 提供的 routing key 并没有处理,不论提供什么 routing key 都会对所有绑定到该 exchange 的 queue 推送消息,所以效果相当于 fanout + random。不实用。
这个
rabbitmq3.7.3 发布了一个新的 exchange x-random的更多相关文章
- VFP 用 SPT 来发布一条 SELECT 到一个新的 SQL Server 表
为了发布一条 SQL SELECT 语句来创建一个新的 SQL Server 表, SQL Server 数据库的 select into/bulkcopy 选项必须是可用的. 在默认情况下, 对于 ...
- 【Cocos2d-x for WP8 学习整理】(1)创建一个新项目
喜大普奔 10.1假期之前看到了一个很振奋的消息,就是随着Cocos2d-x 2.2的发布,WP8/WIN8有史以来第一次的合并到主版本了. 之前 V2 ...
- Git 2.7: 一个新的带来许多新特性和性能提升的主要版本
在2.6版本发布两个月之后,Git 2.7发布.该版本带来了许多新特性以及性能的提升. 本文选取了Git 2.7带来的主要变化: git remote支持get-url子命令,可以显示指定远端的URL ...
- VS发布网站步骤(先在vs上发布网站到新的文件夹,然后挂到iis上面)
VS发布网站步骤(先在vs上发布网站到新的文件夹,然后挂到iis上面) 首先用vs2010打开一个Asp.Net项目, 也可以通过vs菜单->生成->发布网站 选择发布网站的路径 ...
- 开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7
一. 引子 首先感谢博客园:第一篇文章.第一个开源项目,算是旗开得胜.可以看到,项目大部分流量来自于博客园,码农乐园,名不虚传^^. 园友给了我很多支持,并提出了很好的改进意见.现加入屏幕分辨率自 ...
- 一个新的Android Studio 2.3.3可以在稳定的频道中使用。A new Android Studio 2.3.3 is available in the stable channel.
作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com 一个新的Android Studio 2.3 ...
- WebService-01-使用jdk发布第一个WebService服务并调用
Webservice是SOAP+XML,SOAP是基于Http的,Http底层是Socket,先回顾一下Socket: Server: public class Server { public sta ...
- 为 Drupal 7 构建一个新主题
主题解释了 Drupal 网站的用户界面 (UI).虽然主题结构并没有明显的变化,但 Drupal 版本 7 配备了一个新的主题实现方法.本文演示了如何创建一个新的 Drupal 7 主题. Drup ...
- [Xcode 实际操作]九、实用进阶-(28)在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP
目录:[Swift]Xcode实际操作 本文将演示如何在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP. 首先要做的是打开浏览器,并进入[iTunesConnect网站], ...
- Spring Boot 2.2.1 发布,一个有点坑的版本!
上一篇:Spring Boot 2.2.0 正式发布,支持 JDK 13! Spring Boot 2.2.0 没发布多久,Spring Boot 2.2.1 又发布了,这是一个很有意思,又有点 &q ...
随机推荐
- Vite2 如何设置打包后文件名
vite.config.js build: { rollupOptions: { output: { entryFileNames: `assets/[name].${timestamp}.js`, ...
- Android Qcom USB Driver学习(三)
usb hub区分端口 USB 子系统拓扑浅析 USB ID Database VendorID and ProductID usb usb1: New USB device found, idVen ...
- 4.3.2 等比数列的前n项和公式
\({\color{Red}{欢迎到学科网下载资料学习 }}\) [ [基础过关系列]高二数学同步精品讲义与分层练习(人教A版2019)] ( https://www.zxxk.com/docpack ...
- dotnet 使用自定义特性
namespace TETTD.Common { /// <summary> /// 导入excel特性 标记字段映射的列 /// </summary> [AttributeU ...
- jenkins构建pytest持续集成环境时,遇到的一些问题及处理
前言: 构建的项目为pytest+appium+allure,在pycharm里面已将环境代码调试并测试完毕,放到jenkins里执行的一些问题整理 问题1.pycharm里可以正常运行代码,到了je ...
- Derivative norm vector repect to time 《PBM by Pixar》 Appendix D.2 code
目录 1 Derivative normal vector repect to time 1.1 Derivative vector norm repect to time X Ref Vector ...
- sqluldr2linux64.bin命令行下的Oracle数据导出工具
sqluldr2.bin是Oracle数据库下,数据导出的工具 (1)query导出 ./sqluldr2.bin user=用户/密码@主机IP/数据库名 query="select ...
- linu管理文本文件
vi\vim编辑器的三种工作模式 命令模式(Command mode):按键编辑器都理解为命令,以命令驱动执行不同的功能.此模型下,不能自由进行文本编辑. 输入模式(Insert mode):也就是所 ...
- spring下 -spring整体架构,JdbcTemplate笔记
2,搭建Java Maven项目 我的idea是2024.1.1版本,创建普通Maven项目如下图: 用的jdk8,项目名可以自己改,Archetype选图中的第一个就行,之后点 create. 创建 ...
- Flink Checkpoint & Savepoint
Flink checkpoint Checkpoint是Flink实现容错机制最核心的功能,能够根据配置周期性地基于Stream中各个Operator的状态来生成Snapshot,从而将这些状态数据定 ...