python使用rabbitMQ介绍四(路由模式)

一、模式介绍

路由模式,与发布-订阅模式一样,消息发送到exchange中,消费者把队列绑定到exchange上。

这种模式在exchange上添加添加了一个路由键(routing-key),生产者发布消息的时候添加路由键(routing-key),消费者绑定队列到交换机时添加键值(routing-key),这样就可以接收到对应的消息。

路由模式的direct exchange。

队列模型:

与发布-订阅模式不同的是,每个消费者队列接收的消息不同,根据消息的routing-key把消息发送到不同的队列中。

当所有的消费队列绑定的routing-key一样时,路由模式行为与发布-订阅模式一样。

二、代码示意

发布者:不再创建队列,发送消息到exchange(交换机)中。exchange_type为direct。

 1 import pika
 2 import sys
 3
 4 connection = pika.BlockingConnection(pika.ConnectionParameters(host=‘localhost‘))
 5 channel = connection.channel()
 6
 7 channel.exchange_declare(exchange=‘direct_logs‘,
 8                          exchange_type=‘direct‘)
 9
10 severity = [‘info‘, ‘warning‘, ‘error‘]
11 for i in range(20):
12     message = ‘{} Hello World! {}‘.format(i, severity[i % 3])
13     channel.basic_publish(exchange=‘direct_logs‘,
14                           routing_key=severity[i % 3],
15                           body=message)
16     print(" [x] Sent: {}".format(message))
17 connection.close()

每个消费者绑定的队列定义不同的routing-key,接收到不同的消息。

以info为示例:

 1 import pika
 2 import sys
 3
 4 connection = pika.BlockingConnection(pika.ConnectionParameters(host=‘localhost‘))
 5 channel = connection.channel()
 6
 7 channel.exchange_declare(exchange=‘direct_logs‘,
 8                          exchange_type=‘direct‘)
 9
10 result = channel.queue_declare(exclusive=True)
11 queue_name = result.method.queue
12
13 channel.queue_bind(exchange=‘direct_logs‘,
14                    queue=queue_name,
15                    routing_key=‘info‘)
16
17 print(‘ [*] Waiting for logs. To exit press CTRL+C‘)
18
19 def callback(ch, method, properties, body):
20     print(" [x] %r:%r" % (method.routing_key, body))
21
22 channel.basic_consume(callback,
23                       queue=queue_name,
24                       no_ack=True)
25
26 channel.start_consuming()

执行结果输出:

发布者:

[x] Sent: 0 Hello World! info
 [x] Sent: 1 Hello World! warning
 [x] Sent: 2 Hello World! error
 [x] Sent: 3 Hello World! info
 [x] Sent: 4 Hello World! warning
 [x] Sent: 5 Hello World! error
 [x] Sent: 6 Hello World! info
 [x] Sent: 7 Hello World! warning
 [x] Sent: 8 Hello World! error
 [x] Sent: 9 Hello World! info
 [x] Sent: 10 Hello World! warning
 [x] Sent: 11 Hello World! error
 [x] Sent: 12 Hello World! info
 [x] Sent: 13 Hello World! warning
 [x] Sent: 14 Hello World! error
 [x] Sent: 15 Hello World! info
 [x] Sent: 16 Hello World! warning
 [x] Sent: 17 Hello World! error
 [x] Sent: 18 Hello World! info
 [x] Sent: 19 Hello World! warning

Info输出:

[*] Waiting for logs. To exit press CTRL+C
 [x] ‘info‘:b‘0 Hello World! info‘
 [x] ‘info‘:b‘3 Hello World! info‘
 [x] ‘info‘:b‘6 Hello World! info‘
 [x] ‘info‘:b‘9 Hello World! info‘
 [x] ‘info‘:b‘12 Hello World! info‘
 [x] ‘info‘:b‘15 Hello World! info‘
 [x] ‘info‘:b‘18 Hello World! info‘

Warning输出:

[*] Waiting for logs. To exit press CTRL+C
 [x] ‘warning‘:b‘1 Hello World! warning‘
 [x] ‘warning‘:b‘4 Hello World! warning‘
 [x] ‘warning‘:b‘7 Hello World! warning‘
 [x] ‘warning‘:b‘10 Hello World! warning‘
 [x] ‘warning‘:b‘13 Hello World! warning‘
 [x] ‘warning‘:b‘16 Hello World! warning‘
 [x] ‘warning‘:b‘19 Hello World! warning‘

Error输出:

[*] Waiting for logs. To exit press CTRL+C
 [x] ‘error‘:b‘2 Hello World! error‘
 [x] ‘error‘:b‘5 Hello World! error‘
 [x] ‘error‘:b‘8 Hello World! error‘
 [x] ‘error‘:b‘11 Hello World! error‘
 [x] ‘error‘:b‘14 Hello World! error‘
 [x] ‘error‘:b‘17 Hello World! error‘

可以看到,不同的消费者收到不同级别的日志信息。

三、队列信息

管理页面,exchange页面,点击“direct_logs”上查看队列情况,可以看到三个不同routing_key的队列

routing key列展示了对应的key。

原文地址:https://www.cnblogs.com/StitchSun/p/10261510.html

时间: 2024-10-13 09:08:53

python使用rabbitMQ介绍四(路由模式)的相关文章

python使用rabbitMQ介绍五(话题模式)

一.模式介绍 话题模式(Topic)基本思想和路由模式是一样的,只不过路由键支持模糊匹配,符号"#"匹配一个或多个词,符号"*"匹配不多不少一个词 话题模式相当于消息的模糊匹配,或者按照正则匹配.其中 # 是通配符,匹配一个或者多个单词 * 代表匹配一个单词 模式提醒: 当使用#来收消息时,会接收到所有的消息,这样和fanout模式一样了. 当routing key中不含*或者#时,则topic的模式退化为direct的一对一模式. 队列模型: 二.代码示例 发布者

python使用rabbitMQ介绍三(发布订阅模式)

一.模式介绍 在前面的例子中,消息直接发送到queue中. 现在介绍的模式,消息发送到exchange中,消费者把队列绑定到exchange上. 发布-订阅模式是把消息广播到每个消费者,每个消费者接收到的消息都是相同的. 一个生产者,多个消费者,每一个消费者都有自己的一个队列,生产者没有将消息直接发送到队列,而是发送到了交换机,每个队列绑定交换机,生产者发送的消息经过交换机,到达队列,实现一个消息被多个消费者获取的目的.需要注意的是,如果将消息发送到一个没有队列绑定的exchange上面,那么该

RabbitMQ学习第四记:路由模式(direct)

1.什么是路由模式(direct) 路由模式是在使用交换机的同时,生产者指定路由发送数据,消费者绑定路由接受数据.与发布/订阅模式不同的是,发布/订阅模式只要是绑定了交换机的队列都会收到生产者向交换机推送过来的数据.而路由模式下加了一个路由设置,生产者向交换机发送数据时,会声明发送给交换机下的那个路由,并且只有当消费者的队列绑定了交换机并且声明了路由,才会收到数据.下图取自于官方网站(RabbitMQ)的路由模式的图例 P:消息的生产者 X:交换机 红色:队列 C1,C2:消息消费者 error

python - 操作RabbitMQ

python - 操作RabbitMQ 介绍 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过

RabbitMQ(四) ——路由

RabbitMQ(四) --路由 (转载请附上本文链接--linhxx) 一.概述 路由模式(routing)是交换机不将消息广播到全部的队列中,而是采用交换机的另一种模式--direct.该模式下,交换机会精准的将消息发送到某个与其绑定的队列,而不是发送给全部队列. 如果没有队列绑定交换机,消息会丢失. 路由模式如下图所示: 二.绑定方式(binding) 在交换机的fanout模式下,不需要routing key,但是在此模式下,由于交换机需要精准的将消息发送给某个(某些)队列,则需要队列与

[Python]网络爬虫(四):Opener与Handler的介绍和实例应用(转)

在开始后面的内容之前,先来解释一下urllib2中的两个个方法:info and geturl urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info()和geturl() 1.geturl(): 这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许会有重定向.获取的URL或许跟请求URL不同. 以人人中的一个超级链接为例, 我们建一个urllib2_test10.py来比较一下原始URL和重定向的链接: [p

RabbitMQ (六) : 订阅者模式之路由模式 ( direct )

路由模式下,生产者发送消息时需要指定一个路由键(routingKey),交换机只会把消息转发给包含该路由键的队列 这里,我们改变一下声明交换机的方式. 我们通过管理后台添加一个交换机. 添加后,生产者和消费者的代码中就不需要再声明交换机了.同样,也可以通过管理后台添加队列,那么代码中也不需要声明队列了. 生产者 public class Producer { private const string ExchangeName = "test_exchange_direct"; publ

RabbitMQ使用场景_004_路由模式

路由模式 queue只感兴趣这个的exchange.只希望接收交换机中的关键信息,或者说指定内容的信息, 而忽略交换机中的其他消息. direct exchange背后的路由算法很简单--即一个消息的队列binding_key完全匹配message的routing_key. 交换机绑定不同key的队列: 在上图中: exchange X和两个queue绑定在一起.queue Q1的binding key是orange.queue Q2的binding key是black和green. 当P pu

RabbitMQ介绍及安装部署

本节内容: RabbitMQ介绍 RabbitMQ运行原理 RabbitMQ重要术语 三种ExchangeType RabbitMQ集群种类 集群基本概念 镜像模式部署集群 一.RabbitMQ介绍 消息系统通过将消息的发送和接收分离来实现应用程序的异步和解偶.或许你正在考虑进行数据投递,非阻塞操作或推送通知.或许你想要实现发布/订阅,异步处理,或者工作队列.所有这些都属于消息系统的模式.RabbitMQ是一个消息代理,一个消息系统的媒介.它可以为你的应用提供一个通用的消息发送和接收平台,并且保