RabbitMQ官网教程---路由

(使用python客户端pika 0.9.8)

在前面的教程中我们构建了一个简单的日志系统。我们可以给许多接收者广播日志消息。

在这个教程中我们将添加一个特性给它-我们将订阅仅仅一种消息子集成为可能。例如,我们可以指挥仅仅错误消息到日志文件(保存到磁盘空间),它任然可以在控制台打印所有的日志消息。

绑定

在前面的例子中我们已经创建了绑定,你可以重新调用像这样的代码:

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

绑定是exchange和队列之间的一种关系。这可以简单的读作:队列对来自于这个exchange的消息是感兴趣的。

绑定可以使用一个额外的routing_key参数。为了避免跟一个basic_publish参数混乱我们将调用它一个绑定的键。这就是我们如何使用一个键创建一个绑定:

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

绑定键意味着以来exchange类型。fanout类型的exchange,我们用了前面的,简单的忽略它的值。

Direct exchange

前面的教程中我们的日志系统给所有的消费者广播所有的消息。我们想扩展它允许基于它们的服务过滤消息。例如我们也许想让写的脚本仅仅只接收严重的错误日志消息,并且对警告和信息日志上不浪费磁盘空间。

我们使用一个fanout类型的exchange,它不会给我们太多的扩展性-它仅仅能无意识的广播。

我们将使用direct类型的exchange代替它。在direct类型的exchange后面的路由算法是简单的-一个消息进入一个正真匹配绑定键的消息routing_key的队列。

为了阐明这个,考虑下面的设置:

在这个设置中,我们看到direct类型的exchange X有两个队列被绑定给它。第一个队列使用绑定键orange绑定,第二个有两个绑定,一个用绑定键black并且另一个用green。

像这样的设置一个消息使用一个路由键orange被发布到exchange将被路由到队列Q1。使用路由键black或者green将进入Q2。所有的消息将被丢弃。

多个绑定

它完美合法的使用相同的绑定键绑定了多个队列。在我们的例子中我们可以在X和Q1之间天剑一个绑定键black。在那个例子中,direct类型的exchange将表现相似于fanout并且将给所有匹配的队列广播消息。一个使用路由键的black消息将被传递给Q1和Q2。

生产日志

我们将给我们的日志系统使用这种模式。单体fanout我们将给一个direct类型的exchange发送消息。我们将提供日志严重程度作为一个路由键。接收脚本用这种方式就能选择它想要接收的严重程度。我们首先聚焦于生产日志。

我们总是需要首先创建exchange:

channel.exchange_declare(exchange=‘direct_logs‘, type=‘direct‘)

并且我们准备发送一个消息:

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

对于简化的事情我们建议‘严重程度‘可能是‘info‘,‘warning‘,‘error‘中的其中之一。

订阅

接收消息将仅仅像前面的教程一样生效,带着一个异常-我们将给每个我们感兴趣的严重程度创建一个绑定。

result=channel.queue_declare(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的代码:

#!/usr/bin/env python

import pika
import sys

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

channel.exchange_declare(exchange=‘direct_logs‘,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的代码:

#!/usr/bin/env python
import pika
import sys

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

channel.exchange_declare(exchange=‘direct_logs‘, type=‘direct‘)

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

severities = sys.argv[1:]
if not severities:
    print >> sys.stderr, "Usage : %s [info] [warning] [error]" %(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(callback, queue=queue_name, no_ack=True)

channel.start_consuming()
时间: 2024-10-20 12:15:33

RabbitMQ官网教程---路由的相关文章

RabbitMQ官网教程---发布/订阅

(使用python客户端pika 0.9.8) 在前面的教程中我们创建了一个工作队列.假设在一个工作队列后面是每一个被传递给正确的工作者的任务.在这部分中我们将做一些完全不同的事情--我们将给多个消费者传递一个消息.这种模式被称为"发布/订阅". 为了阐明这个模式,我们将构建一个简单的日志系统.它将由两个程序构成--第一个将发出日志消息并且第二个将接收并且打印它们. 在我们的日志系统中每个运行的接收程序副本将获得这个消息.用这种方式我们将可以运行一个接收器并且直接日志到磁盘:而且同时我

RabbitMQ官网教程---主题

(使用python客户端pika 0.9.8) 在前面的教程中我们提高了我们的日志系统.我们使用一个direct类型的exchange代替使用一个fanout类型的exchange的虚拟广播,获取一个可选的接收日志. 尽管使用direct类型的exchange提高了我们的系统,但是它任然是有限的-它不基于多个判断标准路由. 在我们的日志系统中,我们也许想不仅订阅基于严重程度的日志,而且还有基于源的生产日志.你也许从unix的syslog工具中知道了这个概念,它基于严重程度路由日志和设施. 那将给

RabbitMQ官网教程---工作队列

(使用python的pika 0.9.8客户端) 在第一个教程中,我们写了一个从命名的队列中发送和接收消息的程序.在这一个里面,我们将创建一个Work Queue来用于在多个工作者之间分类耗时任务. Work Queues后面的主要思想是避免理解做一些资源密集的任务并且需要等待它完成.我们用计划任务在后面完成它.我们把一个任务封装为一个消息发送给队列.一个在后台执行的工作者队列将弹出任务并且完全的执行这个工作.当你运行许多工作者的时候,这个任务将在它们之间共享. 这种概念在web应用程序中是特别

Java Web框架-----------------------struts2(官网教程版HelloWorld)

Java Web框架------------------struts2(官网教程版HelloWorld) 我们都知道Struts是Java Web 常用的三大框架之一,另外还有Spring.Hibernate.学习Struts很有必 要!那么怎么学习呢?我的建议是: 1.对于英语能力还可以的人,学技术我们要从官网文档学起,再结合中文别人所写的论文.博客,视频 等.这样可以达到事半功倍的效果. 2.对于阅读英语稍微吃力的人,我们可以下载有道词典,再来本计算机专业英语书,不懂就查,但是, 我们决不能

Django学习笔记 官网教程纠正 代码

原文: Django学习笔记 官网教程纠正 代码 Django学习笔记 4.模板初学中,照书例django book 出现以下异常 raise ImportError("Settings cannot be imported, because environment variable %s is undefined." % ENVIRONMENT_VARIABLE) ImportError: Settings cannot be imported, because environmen

[pytorch] 官网教程+注释

pytorch官网教程+注释 Classifier import torch import torchvision import torchvision.transforms as transforms transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) trainset = torchvision.datasets.CIF

Unity 官网教程 -- Multiplayer Networking

教程网址:https://unity3d.com/cn/learn/tutorials/topics/multiplayer-networking/introduction-simple-multiplayer-example?playlist=29690 1. 新建一个3D工程,在菜单 "File"  - "Save Scenes" ,保存场景为 "Main".注意,保存的文件放在Assets目录下. 2.菜单"GameObject&

Postman 官网教程,重点内容,翻译笔记,

json格式的提交数据需要添加:Content-Type :application/x-www-form-urlencoded,否则会导致请求失败 1. 创建 + 测试: 创建和发送任何的HTTP请求,请求可以保存到历史中再次执行2. Organize: 使用Postman Collections为更有效的测试及集成工作流管理和组织APIs3. document: 依据你创建的Clollections自动生成API文档,并将其发布成规范的格式4. collarorate: 通过同步连接你的tea

Gatling官网教程翻译之Advanced Tutorial

高级教程 在这一部分,我们假设读者已经完成了前面Quickstart的学习部分.而且你已经有了一个基础的simulation. 我们在这一部分将通过一系列的重构,向读者介绍更多Gatling的高级用法和DSL结构. 回顾下已有的Simulation: 1 package computerdatabase 2 import io.gatling.core.Predef._ 3 import io.gatling.http.Predef._ 4 import scala.concurrent.dur