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 ...
随机推荐
- maven的pom.xml基础配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- spring boot 与spring boot admin整合问题处理
1.在整合springboot admin server时,发现admin client无法注册到admin server上 查找原因后发现代码中报错:HttpMediaTypeNotAcceptab ...
- day10-变量、常量、作用域及命名规范
变量 变量是什么?就是可以变化的量! Java是一种强类型语言,每个变量都必须声明其类型. Java变量是程序中最基本的存储单元,其要素包括变量名.变量类型和作用域. type varName [ ...
- KubeSphere 部署 Kafka 集群实战指南
本文档将详细阐述如何利用 Helm 这一强大的工具,快速而高效地在 K8s 集群上安装并配置一个 Kafka 集群. 实战服务器配置(架构 1:1 复刻小规模生产环境,配置略有不同) 主机名 IP C ...
- 使用 OpenFunction 在任何基础设施上运行 Serverless 工作负载
作者: 霍秉杰:KubeSphere 可观测性.边缘计算和 Serverless 团队负责人,Fluent Operator 和 OpenFunction 项目的创始人,还是多个可观测性开源项目包括 ...
- 会话层技术-cookie
会话层技术cookie的使用 cookie拿下! package com.atguigu.servlet; import javax.servlet.ServletException; import ...
- 文件操作(C语言)
1. 为什么使用文件? 如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用 ...
- Codeforces 1847 A-F
题面 A B C D E F 难度:红 橙 黄 蓝 紫 紫 题解 B 题目大意:找到一组分割方法,使得 \(\sum _{i=1} ^ k (\text{&} _{j=l_i} ^ {r_i} ...
- ABP发布后通过外部URL调用不到方法
MVC要与Host项目发布保持同步,如果Host工程不保持同步就会导致调用不到新的方法,因为找不得新的dll.
- OpenMM的安装与使用
技术背景 OpenMM是一款基于Python开发的开源分子动力学模拟软件,这几年因为AlphaFold的缘故,使得这个软件的热度有了不少提升.并且可以使用GPU硬件加速,所以性能上也不赖.这里介绍一下 ...