IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python之RabbitMQ教程四 -> 正文阅读

[Python知识库]python之RabbitMQ教程四

路由-Routing

在之前的教程中,我们构建了一个简单的日志系统。我们能够向许多接收器广播日志消息。

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

绑定

在前面的例子中,我们已经在创建绑定。你可能会想起这样的代码:

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

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

绑定可以采用额外的routing_key参数。为了避免与basic_publish参数混淆,我们将称其为binding key。这时我们如何创建绑定:

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

binding key的含义取决于交换类型。我们之前使用的fanout交换只是忽略了它的值。

直接交换(Direct exchange)

我们上一教程中的日志系统将所有消息广播给所有消费者。我们希望扩展它以允许根据其严重性过滤消息。例如,我们可能希望将日志消息写入磁盘的脚本只接收严重错误,而不是在警告或信息日志消息上浪费磁盘空间。

我们使用的的fanout交换,它没有给我们太多的灵活性——它只能进行无意识的广播。

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

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

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

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

多重绑定

使用相同的绑定键绑定多个队列是完全合法的。在我们的示例中,我们可以使用绑定键black在X和Q1之间添加一个绑定。在这种情况下,直接交换的行为类似于扇出,并将消息广播到所有匹配的队列。路由键为black的消息将同时发送到Q1和Q2。

发出日志

我们将在我们的日志系统中使用这个模型。我们将向direct交换发送消息而不是fanout。我们将提供日志严重性作为路由键。这样接收脚本将能够选择它想要接收的严重性。让我们首先专注于发出日志。

像往常一样,我们需要先创建一个交换:

channel.exchange_declare(exchange='direct_logs',
                         exchange_type='direct')

?我们准备发送消息:

channel.basic_publish(exchange='direct_logs',
                      routing_key=severity,
                      body=message)

为了简化事情,我们假设“severity”可以是“info”、“warning”、“error”之一.

订阅

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

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)

把这一切放在一起

emit_log_direct.py文件的整体代码为:

import pika
import sys

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

channel.exchange_declare(exchange='direct_logs', exchange_type='direct')

severity = sys.argv[1] if len(sys.argv) > 1 else 'info'
message = ' '.join(sys.argv[2:]) or 'Hello World!'
channel.basic_publish(
    exchange='direct_logs', routing_key=severity, body=message)
print(" [x] Sent %r:%r" % (severity, message))
connection.close()

?receive_logs_direct.py文件整体代码为:

import pika
import sys

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

channel.exchange_declare(exchange='direct_logs', exchange_type='direct')

result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.method.queue

severities = sys.argv[1:]
if not severities:
    sys.stderr.write("Usage: %s [info] [warning] [error]\n" % sys.argv[0])
    sys.exit(1)

for severity in severities:
    channel.queue_bind(
        exchange='direct_logs', queue=queue_name, routing_key=severity)

print(' [*] Waiting for logs. To exit press CTRL+C')


def callback(ch, method, properties, body):
    print(" [x] %r:%r" % (method.routing_key, body))


channel.basic_consume(
    queue=queue_name, on_message_callback=callback, auto_ack=True)

channel.start_consuming()

如果您只想将“warning”和“error”(而不是“info”)日志消息保存到文件中,只需打开控制台并键入:

python receive_logs_direct.py warning error > logs_from_rabbit.log

如果您想在屏幕上查看所有日志消息,请打开一个新终端并执行以下操作:

python receive_logs_direct.py info warning error
# => [*] Waiting for logs. To exit press CTRL+C

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-01 17:39:41  更:2021-12-01 17:39:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:49:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码