官网就是最好的文档

上一篇文章RabbitMq Publish/Subscribe消息发布订阅模式 消息发布订阅模式中,就是通过广播来实现分发的。所有的customer都能够收到全部的消息。实际业务场景是需要filter的,怎么办?

我们将为其添加一个功能 - 我们将只能订阅一部分消息。例如,我们只能将关键错误消息定向到日志文件(以节省磁盘空间),同时仍然能够在控制台上打印所有日志消息。

Bindings

在前面的例子中,我们已经创建了绑定。您可能会记得以下代码:

channel.queue_bind(exchange=exchange_name,queue=queue_name)

绑定是交换和队列之间的关系。这可以简单地理解为:队列对来自此交换的消息感兴趣。

绑定可以采用额外的routing_key参数。为了避免与basic_publish参数混淆,我们将其称为 绑定密钥。这就是我们如何使用键创建绑定

channel.queue_bind(exchange=exchange_name,queue=queue_name,routing_key='black')

其实就是加了一个routing_key 参数
绑定密钥的含义取决于交换类型。我们之前使用的 fanout交换只是忽略了它的价值。

Direct exchange

我们希望扩展以允许根据消息的严重性过滤消息。例如,我们可能希望将日志消息写入磁盘的脚本仅接收严重错误,而不是在警告或信息日志消息上浪费磁盘空间。
我们正在使用fanout交换,它不会给我们太多的灵活性 - 它只能进行无意识的广播。

我们将使用direct交换。direct交换背后的路由算法很简单 - 消息进入队列,其 binding key与routing key完全匹配。

为了说明这一点,请考虑以下设置:

在此设置中,我们可以看到direct交换X与两个绑定到它的队列。第一个队列绑定orange绑定,第二个绑定有两个绑定,一个绑定密钥为black,另一个绑定为green。

在这样的设置中,使用routing key orange发布到交换机的消息 将被路由到队列Q1。 routing key为black 或green的消息将转到Q2。所有其他消息将被丢弃。

Multiple bindings

使用相同的 binding key绑定多个队列是完全合法的。在我们的示例中,我们可以在X和Q1之间添加绑定键black的绑定。在这种情况下,直接交换将表现得像fanout一样,并将消息广播到所有匹配的队列。路由键为black的消息将传送到 Q1和Q2。

Subscribing

接收消息将像上一个教程一样工作,但有一个例外 - 我们将为我们感兴趣的每个严重性创建一个新的绑定。

result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.method.queue
for severity in severities:channel.queue_bind(exchange='direct_logs',queue=queue_name,routing_key=severity)

下面通过Code 加深理解。
消息发布订阅Client_direct.py

import pika
import time
credentials = pika.PlainCredentials('xiaoxia', 'xiaoxia')
connection = pika.BlockingConnection(pika.ConnectionParameters('47.244.28.93', 5672, '/', credentials))
# 声明queue
channel = connection.channel()
channel.exchange_declare(exchange='round_robin_queue_mmmm',exchange_type='direct')
# n RabbitMQ a message can never be sent directly to the queue, it always needs to go through an exchange.
n = 20
sum = 0
counter = 1
rounting_keyName='routing_key_test1'
while counter <= n:channel.basic_publish(exchange='round_robin_queue_mmmm',                 #Producer只能发送到exchange,它是不能直接发送到queue的,发送到默认exchangerouting_key=rounting_keyName,         #路由key发送指定队列body='Hello World:'+str(counter)) #发送的消息counter += 1
print(" [x] Sent 'Hello World!'")
connection.close()

消息发布订阅Server_direct.py
消息发布订阅Server_direct1.py

import pika
import time
credentials = pika.PlainCredentials('xiaoxia', 'xiaoxia')
#建立连接
connection = pika.BlockingConnection(pika.ConnectionParameters('47.244.28.93', 5672, '/', credentials))
channel = connection.channel()
channel.exchange_declare(exchange='round_robin_queue_mmmm', exchange_type='direct')
result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.method.queue
rounting_keyName='routing_key_test1'
channel.queue_bind(exchange='round_robin_queue_mmmm',queue=queue_name,routing_key=rounting_keyName)
print(' [*] Waiting for logs. To exit press CTRL+C')
print(' [*] queue_name:'+queue_name)def callback(ch, method, properties, body):  #定义回调函数用于取出队列中的数据print(" [x] Received %r" % body)time.sleep(1)ch.basic_ack(delivery_tag=method.delivery_tag)channel.basic_consume(queue=queue_name,on_message_callback=callback)          #不确认消息
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()                      #监听数据消息发布订阅Server_direct1.py
import pika# 在这种模式下,RabbitMQ会默认把p发的消息依次分发给各个消费者(c),跟负载均衡差不多
credentials = pika.PlainCredentials('xiaoxia', 'xiaoxia')
# 建立连接
connection = pika.BlockingConnection(pika.ConnectionParameters('47.244.28.93', 5672, '/', credentials))
channel = connection.channel()
channel.exchange_declare(exchange='round_robin_queue_mmmm', exchange_type='direct')
result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.method.queue
rounting_keyName = 'routing_key_test11'
channel.queue_bind(exchange='round_robin_queue_mmmm',queue=queue_name,routing_key=rounting_keyName)
print(' [*] Waiting for logs. To exit press CTRL+C')
print(' [*] queue_name:' + queue_name)def callback(ch, method, properties, body):  # 定义回调函数用于取出队列中的数据print(" [x] Received %r" % body)time.sleep(1)ch.basic_ack(delivery_tag=method.delivery_tag)channel.basic_consume(queue=queue_name,on_message_callback=callback)  # 不确认消息
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()  # 监听数据


可以看到 消息发布订阅Server_direct.py 消息发布订阅Server_direct1.py在direct模式下,唯一的区别就是routing_key 不同,一个能够接收到数据,一个不能够接收。从而达到了filter过滤的目的

RabbitMq Direct exchange路由模型相关推荐

  1. springboot rabbitmq direct exchange和topic exchange 写法上关于路由键的区别

    这是direct exchange写法中消息发送写法,可见下图红色框中路由键是queue队列中定义的路由键 这是topic exchange写法中消息发送写法,可见下图红色框中路由键是exchange ...

  2. RabbitMQ指南之四:路由(Routing)和直连交换机(Direct Exchange)

    在上一章中,我们构建了一个简单的日志系统,我们可以把消息广播给很多的消费者.在本章中我们将增加一个特性:我们可以订阅这些信息中的一些信息.例如,我们希望只将error级别的错误存储到硬盘中,同时可以将 ...

  3. RabbitMQ的Routing 路由模式(Direct)

    RabbitMQ的Routing 路由模式 模式说明: 队列与交换机的绑定,不能是任意绑定了,而是要指定一个 RoutingKey(路由key) 消息的发送方在向 Exchange 发送消息时,也必须 ...

  4. RabbitMQ支持的消息模型

    一.rabbitMQ支持的消息模型如下 第一种模型(直连) 在上图的模型中,有以下概念: P:生产者,也就是要发送消息的程序 C:消费者:消息的接受者,会一直等待消息到来. queue:消息队列,图中 ...

  5. RabbitMQ入门:路由(Routing)

    在上一篇博客<RabbitMQ入门:发布/订阅(Publish/Subscribe)>中,我们认识了fanout类型的exchange,它是一种通过广播方式发送消息的路由器,所有和exch ...

  6. rabbitmq direct 多个消费者_一文解析 RabbitMQ 最常用的三大模式

    Direct 模式 所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue. Direct 模式可以使用 RabbitMQ 自带的 Exchange: de ...

  7. RabbitMQ交换器Exchange介绍与实践

    导读 有了Rabbit的基础知识之后(基础知识详见:深入解读RabbitMQ工作原理及简单使用),本章我们重点学习一下Rabbit里面的exchange(交换器)的知识. 交换器分类 RabbitMQ ...

  8. rabbitmq在exchange下的两种使用模式

    上一篇,我们介绍了rabbimtmq的简单工作队列的使用方式,即生产者和消费者之间直接通过绑定相同的workqueue进行消息的发送和接收,如果业务逻辑比较简单,这样的方式也是可以用的,但在实际工作中 ...

  9. RabbitMQ交换器Exchange

    交换器分类 RabbitMQ的Exchange(交换器)分为四类: direct(默认) headers fanout topic 其中headers交换器允许你匹配AMQP消息的header而非路由 ...

最新文章

  1. oracle 11g ORA-12514
  2. spring3 发送邮件和附件
  3. 【蓝桥杯】算法提高 7-2求arccos值
  4. PE下如何安装 安装版系统
  5. python统计元音总数_python – 元音序列计数
  6. HTML5前端开发就业前景,高薪背后的原因分析!
  7. 东北老家有人在大连娶了媳妇
  8. ACL-IJCNLP 2021|行业首个少样本NER数据集,清华联合阿里达摩院开发
  9. 使用.net开发并生成Windows服务安装包
  10. 用联发科芯片的手机能升级鸿蒙吗,华为鸿蒙系统降临!首批升级手机确定,联发科芯片被放弃?...
  11. win 启动redis_Redis慢查询日志
  12. 密码学基础(二):对称加密
  13. 如何注册海外邮箱?如何进行邮箱注册163,这些技巧交给你
  14. 功能完整的矢量图编辑软件——Boxy SVG for Mac 3.25.0激活版
  15. Echarts图表隐藏X轴和Y轴
  16. 童年往事,好看的电影,好听的音乐!
  17. 垂钓之王hd_它的专业人士指南,以阻止网络钓鱼
  18. 阿昆同学的Java学习日记Day4
  19. 用easywechat插件做微信支付
  20. arr和arr的区别以及数组首元素地址和整个数组地址的区别

热门文章

  1. Six提供了Python 2和Python 3的兼容库
  2. Obsidian+SyncTrayzor打造个人文档云同步平台
  3. Introspector
  4. svm分类器_使用放射学机器学习分类器区分胶质母细胞瘤与孤立性脑转移瘤
  5. 微信小程序把阿里icon变为组件
  6. 大众点评美食商家电话爬虫
  7. MySQL高可用架构MHA
  8. DNS 服务器 清除缓存
  9. 模型的评估指标(一)
  10. HDU - 1873 看病要排队(优先队列)