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

一、模式介绍

在前面的例子中,消息直接发送到queue中。

现在介绍的模式,消息发送到exchange中,消费者把队列绑定到exchange上。

发布-订阅模式是把消息广播到每个消费者,每个消费者接收到的消息都是相同的。

一个生产者,多个消费者,每一个消费者都有自己的一个队列,生产者没有将消息直接发送到队列,而是发送到了交换机,每个队列绑定交换机,生产者发送的消息经过交换机,到达队列,实现一个消息被多个消费者获取的目的。需要注意的是,如果将消息发送到一个没有队列绑定的exchange上面,那么该消息将会丢失,这是因为在rabbitMQ中exchange不具备存储消息的能力,只有队列具备存储消息的能力。

队列模型:

二、代码示例

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

 1 #!/usr/bin/env python
 2 import pika
 3
 4 connection = pika.BlockingConnection(pika.ConnectionParameters(host=‘localhost‘))
 5 channel = connection.channel()
 6
 7 channel.exchange_declare(exchange=‘logs‘,
 8                          exchange_type=‘fanout‘)
 9
10 for i in range(20):
11     message = "info: Hello World! {}".format(i)
12     channel.basic_publish(exchange=‘logs‘,
13                           routing_key=‘‘,
14                           body=message)
15     print(" [x] Sent %r" % message)
16 connection.close()

订阅者

订阅者:每个消费者创建一个匿名队列,绑定到对应的exchange上,接收消息。一旦消费者的connection端口,对应的队列则关闭,不在接收消息。使用exclusive 来控制。

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

发布者输出:

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

  

订阅者输出:

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

 

可以看到两个订阅者收到的消息是一样的。

每个订阅者的状态变化不会影响另外的订阅者收到的消息。

三、队列信息

在web管理页面上,查看exchange中的logs,可以看到两个队列。

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

时间: 2024-10-01 02:49:08

python使用rabbitMQ介绍三(发布订阅模式)的相关文章

RabbitMQ/JAVA (发布/订阅模式)

发布/订阅模式即生产者将消息发送给多个消费者. 下面介绍几个在发布/订阅模式中的关键概念-- 1. Exchanges (转发器) 可能原来我们都是基于一个队列发送和接收消息.现在介绍一下完整的消息传递模式. Rabbitmq消息模式的核心理念是:生产者没有直接发送任何消息到队列.实际上,生产者都不知道这个消息是发送给哪个队列的.相反,生产者只能发送消息给转发器. 转发器一方面接收生产者的消息,另一方面向队列推送消息. 转发器必须清楚的指导如何处理接收到的消息,需要附加队列吗?附加几个?或者是否

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

一.模式介绍 路由模式,与发布-订阅模式一样,消息发送到exchange中,消费者把队列绑定到exchange上. 这种模式在exchange上添加添加了一个路由键(routing-key),生产者发布消息的时候添加路由键(routing-key),消费者绑定队列到交换机时添加键值(routing-key),这样就可以接收到对应的消息. 路由模式的direct exchange. 队列模型: 与发布-订阅模式不同的是,每个消费者队列接收的消息不同,根据消息的routing-key把消息发送到不同

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

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

rabbitMQ交换机的发布订阅模式

生产者: # !/usr/bin/env python # -*- coding: utf-8 -*- import pika # 创建连接对象 connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) channel = connection.channel() # 创建交换机 channel.exchange_declare(exchange='logs', exchange_type=

RabbitMQ学习第三记:发布/订阅模式(Publish/Subscribe)

工作队列模式是直接在生产者与消费者里声明好一个队列,这种情况下消息只会对应同类型的消费者. 举个用户注册的列子:用户在注册完后一般都会发送消息通知用户注册成功(失败).如果在一个系统中,用户注册信息有邮箱.手机号,那么在注册完后会向邮箱和手机号都发送注册完成信息.利用MQ实现业务异步处理,如果是用工作队列的话,就会声明一个注册信息队列.注册完成之后生产者会向队列提交一条注册数据,消费者取出数据同时向邮箱以及手机号发送两条消息.但是实际上邮箱和手机号信息发送实际上是不同的业务逻辑,不应该放在一块处

ActiveMQ入门系列三:发布/订阅模式

在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点模式并用代码实例进行说明,今天就介绍下发布/订阅模式. 一.理论基础 发布/订阅模式的工作示意图: 消息生产者将消息(发布)到topic中,可以同时有多个消息消费者(订阅)消费该消息. 和点对点方式不同,发布到topic的消息会被所有订阅者消费. 当生产者发布消息,不管是否有消费者,都不会保存消息. 一定要先

RabbitMQ指南之三:发布/订阅模式(Publish/Subscribe)

在上一章中,我们创建了一个工作队列,工作队列模式的设想是每一条消息只会被转发给一个消费者.本章将会讲解完全不一样的场景: 我们会把一个消息转发给多个消费者,这种模式称之为发布-订阅模式. 为了阐述这个模式,我们将会搭建一个简单的日志系统,它包含两种程序:一种发送日志消息,另一种接收并打印日志消息.在这个日志系统里,每一个运行的消费者都可以获取到消息,在这种情况下,我们可以实现这种需求:一个消费者接收消息并写入磁盘,另一个消费者接收消息并打印在电脑屏幕上.简单来说,生产者发布的消息将会以广播的形式

Redis研究(十六)—发布/订阅模式

在上一篇中我们写了Redis的任务队列. 除了实现任务队列外,Redis还提供了一组命令可以让开发者实现"发布/订阅"(publish/subscribe)模式."发布/订阅"模式同样可以实现进程间的消息传递,其原理是这样的: "发布/订阅"模式中包含两种角色,分别是发布者和订阅者.订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息. 发布者发布消息的命令是PUBLISH,用法

观察者模式Vs发布订阅模式

1)观察者模式 观察者模式通俗的讲就是我们平事件调用(click/change等等) 大家先看这个图片.我们被观察者Subject(监听某个事件)发生改变时,观察者Observer监听到没改变做出调整.最大的特点是实现了松耦合(如何理解松耦合呢?个人认为就是当Subject 发生给变时,我们有一套对应的Observer集合,当Subject中的模块1 给变时对应的Observer1做出反应,当Subject中的模块2 给变时对应的Observer2做出反应...,不必全部都是一一对应,来实现松耦