首页 > 其他分享 >RabbitMQ发布订阅模式

RabbitMQ发布订阅模式

时间:2023-03-10 18:00:38浏览次数:53  
标签:订阅 exchange 队列 模式 queue 交换机 RabbitMQ channel

发布订阅和简单的消息队列区别在于,发布订阅会将消息发送给所有的订阅者,而消息队列中的数据被消费一次便消失。所以,RabbitMQ实现发布和订阅时,会为每一个订阅者创建一个队列,而发布者发布消息时,会将消息放置在所有相关队列中。

发布订阅模式:
发布者 创建一块独立空间,将数据放置到这个空间中。
订阅者创建队列,去这块独立空间复制里面的数据,放入自己的队列中。
所有订阅者都会接收到订阅者的全部内容。
一块独立空间被称为"交换机1",可创建多块"交换机2"、“交换机3”、“交换机4”、
1个"交换机"有多个订阅者订阅。

发布者

# pip install pika

# 生产者 发生方
import pika

# python 链接 RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('127.0.0.1'))
channel = connection.channel()

# 持久化模式的作用:
# 运行发送端 RabbitMQ 服务正在启动 时发送
# RabbitMQ 服务正在停止后,重新启动
# 接收端 依然可以接受到发送端的信息
# 注意:持久化模式 需要单独指定一个队列,不能与非持久化模式混用一个队列名

# 声明一个名为 lbw 类型为 fanout 的交换机
channel.exchange_declare(exchange='lbw', # 指定交换机 名字任意
exchange_type='fanout') # 指定类型

# 向 lbw 交换机插入数据
SB = "SB_123"

# exchange='' 指定交换机名、 routing_key='hello' 指定队列
channel.basic_publish(exchange='lbw',
routing_key='', # 发布订阅模式 这里为空 因为这里无需使用关键字
body=SB)
print("已发送")

connection.close()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

订阅者

# 消费者 接收方

import pika

# python 链接 RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('127.0.0.1'))
channel = connection.channel()

# 声明一个名为 lbw 类型为 fanout 的交换机
channel.exchange_declare(exchange='lbw', # 指定交换机 名字任意
exchange_type='fanout') # 指定类型

# 创建队列 生成队列名:exclusive=True
result = channel.queue_declare("", exclusive=True)
# 拿到 队列名
queue_name = result.method.queue

# 将 队列 绑定 交换机
channel.queue_bind(exchange='lbw',
queue=queue_name)

# 确定回调函数
def callback(ch, method, properties, body):
print(body)

<span class="token comment"># 业务逻辑处理。。。。。。</span>

<span class="token comment"># 手动应答模式</span>
<span class="token comment"># 处理完成发送给 消息队列 处理完成的信号</span>
ch<span class="token punctuation">.</span>basic_ack<span class="token punctuation">(</span>delivery_tag<span class="token operator">=</span>method<span class="token punctuation">.</span>delivery_tag<span class="token punctuation">)</span>

# 确定 监听队列
channel.basic_consume(queue=queue_name,
# 默认应答:快
# auto_ack=True, # 默认应答:收到1个数据,队列中就会少一个数据 如果处理业务逻辑时报错,当前的数据就会丢失
# 手动应答:安全
auto_ack=False, # 手动应答:收到1个数据,等发送处理完毕的信号后,队列中才会少一个数据
on_message_callback=callback)

print(1)
channel.start_consuming()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

标签:订阅,exchange,队列,模式,queue,交换机,RabbitMQ,channel
From: https://www.cnblogs.com/clark1990/p/17204320.html

相关文章

  • 02 b模式
    """@作者:egon老湿@微信:18611453110@专栏:https://zhuanlan.zhihu.com/c_1189883314197168128控制文件读写内容的模式t:1、读写都是以字符串(unicode)为单位2、只......
  • 01 x模式
    """@作者:egon老湿@微信:18611453110@专栏:https://zhuanlan.zhihu.com/c_1189883314197168128x模式(控制文件操作的模式)-》了解x,只写模式【不可读;不存在则创建,存在......
  • 设计模式系列一策略模式
    一.策略模式(StrategyPattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一......
  • Ubuntu 20.04 双网卡绑定bond 主备模式
     一、active-backup-主备模式一个网卡处于活动状态,另一个处于备份状态,所有流量都在主链路上处理,当活动网卡down掉时,启用备份网卡。 1、实验环境VMware虚拟机,系统Ubu......
  • 设计模式-javascript实现【外观模式】
    定义:外观模式又叫门面模式,外观模式为一个系统中的子系统提供一个统一的高层接口,从而方便使用子系统。1.用类实现外观模式classCpu{install(){console.log('......
  • read超时,write,accept,connect超时函数,设置io阻塞模式
    1.设置I/O为阻塞模式  2.设置I/O为阻塞模式  超时函数:  3.读超时4.写超时  5.accept_timeout超时函数   主调函数 ......
  • SOLIDWORKS免费培训 SW大型装配体模式课程
    在SOLIDWORKS的使用过程中,大家经常会遇到大型装配体的处理问题,微辰三维的培训课程中也包含了一些大型装配体的技术培训,下面整理一些常见问题,供参考:大型装配体模式1.当我们打......
  • 使用Python实现单例模式
    在使用类名()创建对象时,python解释器首先会调用__new__()方法为对象分配内存,然后再调用__init__()方法进行初始化: 其中__new__()是object基类提供的内置静态方......
  • 好客租房66-render-props模式-2使用模式
    使用步骤创建Mouse组件,在组件中提供复用状态逻辑代码(1:状态2操作状态的方法)2将要复用的状态作为props.render(state)方法的参数暴露到组件外部//导入reactimportRea......
  • 基于敏捷模式下的测试改进分析
    一、首先是要改进新功能测试的策略一般来说,每次短期的迭代都有新的功能加入产品中,因此,针对新功能的测试方法,在短期迭代周期中需要改进。不需要编写测试用例,直接基......