iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python操作RabbitMq的三种工作模式是什么
  • 607
分享到

python操作RabbitMq的三种工作模式是什么

2023-06-30 00:06:04 607人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这篇“python操作RabbitMQ的三种工作模式是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python操作Ra

这篇“python操作RabbitMQ的三种工作模式是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python操作RabbitMQ的三种工作模式是什么”文章吧。

一、简介:

  RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件。消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取 完成通信。而作为中间件的 RabbitMq 无疑是目前最流行的消息队列之一。

RabbitMq 应用场景广泛:

  • 系统的高可用:日常生活当中各种商城秒杀,高流量,高并发的场景。当服务器接收到如此大量请求处理业务时,有宕机的风险。某些业务可能极其复杂,但这部分不是高时效性,不需要立即反馈给用户,我们可以将这部分处理请求抛给队列,让程序后置去处理,减轻服务器在高并发场景下的压力。

  • 分布式系统,集成系统,子系统之间的对接,以及架构设计中常常需要考虑消息队列的应用。

二、RabbitMq 生产和消费

生产者(producter):队列消息的产生者,负责生产消息,并将消息传入队列

import pikaimport JSONcredentials = pika.PlainCredentials('shampoo', '123456')  # mq用户名和密码# 虚拟队列需要指定参数 virtual_host,如果是默认的可以不填。connection = pika.BlockinGConnection(pika.ConnectionParameters(host = '10.1.62.170',port = 5672,virtual_host = '/',credentials = credentials))channel=connection.channel()# 声明消息队列,消息将在这个队列传递,如不存在,则创建result = channel.queue_declare(queue = 'python-test')for i in range(10):    message=json.dumps({'OrderId':"1000%s"%i})# 向队列插入数值 routing_key是队列名    channel.basic_publish(exchange = '',routing_key = 'python-test',body = message)    print(message)connection.close()

消费者(consumer):队列消息的接收者,负责 接收并处理 消息队列中的消息

import pikacredentials = pika.PlainCredentials('shampoo', '123456')connection = pika.BlockingConnection(pika.ConnectionParameters(host = '10.1.62.170',port = 5672,virtual_host = '/',credentials = credentials))channel = connection.channel()# 申明消息队列,消息在这个队列传递,如果不存在,则创建队列channel.queue_declare(queue = 'python-test', durable = False)# 定义一个回调函数来处理消息队列中的消息,这里是打印出来def callback(ch, method, properties, body):    ch.basic_ack(delivery_tag = method.delivery_tag)    print(body.decode())# 告诉rabbitmq,用callback来接收消息channel.basic_consume('python-test',callback)# 开始接收信息,并进入阻塞状态,队列里有信息才会调用callback进行处理channel.start_consuming()

三、RabbitMq 持久化

MQ默认建立的是临时 queue 和 exchange,如果不声明持久化,一旦 rabbitmq 挂掉,queue、exchange 将会全部丢失。所以我们一般在创建 queue 或者 exchange 的时候会声明 持久化。

queue 声明持久化

# 声明消息队列,消息将在这个队列传递,如不存在,则创建。durable = True 代表消息队列持久化存储,False 非持久化存储result = channel.queue_declare(queue = 'python-test',durable = True)

exchange 声明持久化

# 声明exchange,由exchange指定消息在哪个队列传递,如不存在,则创建.durable = True 代表exchange持久化存储,False 非持久化存储channel.exchange_declare(exchange = 'python-test', durable = True)

注意:如果已存在一个非持久化的 queue 或 exchange ,执行上述代码会报错,因为当前状态不能更改 queue 或 exchange 存储属性,需要删除重建。如果 queue 和 exchange 中一个声明了持久化,另一个没有声明持久化,则不允许绑定。

消息持久化

虽然 exchange 和 queue 都申明了持久化,但如果消息只存在内存里,rabbitmq 重启后,内存里的东西还是会丢失。所以必须声明消息也是持久化,从内存转存到硬盘。

# 向队列插入数值 routing_key是队列名。delivery_mode = 2 声明消息在队列中持久化,delivery_mod = 1 消息非持久化    channel.basic_publish(exchange = '',routing_key = 'python-test',body = message,                          properties=pika.BasicProperties(delivery_mode = 2))

acknowledgement 消息不丢失

消费者(consumer)调用callback函数时,会存在处理消息失败的风险,如果处理失败,则消息丢失。但是也可以选择消费者处理失败时,将消息回退给 rabbitmq ,重新再被消费者消费,这个时候需要设置确认标识。

channel.basic_consume(callback,queue = 'python-test',# no_ack 设置成 False,在调用callback函数时,未收到确认标识,消息会重回队列。True,无论调用callback成功与否,消息都被消费掉                      no_ack = False)

三、RabbitMq 发布与订阅

rabbitmq 的发布与订阅要借助交换机(Exchange)的原理实现:

python操作RabbitMq的三种工作模式是什么

Exchange 一共有三种工作模式:fanout, direct, topicd

模式一:fanout

这种模式下,传递到 exchange 的消息将会转发到所有与其绑定的 queue 上。

  • 不需要指定 routing_key ,即使指定了也是无效。

  • 需要提前将 exchange 和 queue 绑定,一个 exchange 可以绑定多个 queue,一个queue可以绑定多个exchange。

  • 需要先启动 订阅者,此模式下的队列是 consumer 随机生成的,发布者 仅仅发布消息到 exchange ,由 exchange 转发消息至 queue。

发布者:

import pikaimport jsoncredentials = pika.PlainCredentials('shampoo', '123456')  # mq用户名和密码# 虚拟队列需要指定参数 virtual_host,如果是默认的可以不填。connection = pika.BlockingConnection(pika.ConnectionParameters(host = '10.1.62.170',port = 5672,virtual_host = '/',credentials = credentials))channel=connection.channel()# 声明exchange,由exchange指定消息在哪个队列传递,如不存在,则创建。durable = True 代表exchange持久化存储,False 非持久化存储channel.exchange_declare(exchange = 'python-test',durable = True, exchange_type='fanout')for i in range(10):    message=json.dumps({'OrderId':"1000%s"%i})# 向队列插入数值 routing_key是队列名。delivery_mode = 2 声明消息在队列中持久化,delivery_mod = 1 消息非持久化。routing_key 不需要配置    channel.basic_publish(exchange = 'python-test',routing_key = '',body = message,                          properties=pika.BasicProperties(delivery_mode = 2))    print(message)connection.close()

订阅者:

import pikacredentials = pika.PlainCredentials('shampoo', '123456')connection = pika.BlockingConnection(pika.ConnectionParameters(host = '10.1.62.170',port = 5672,virtual_host = '/',credentials = credentials))channel = connection.channel()# 创建临时队列,队列名传空字符,consumer关闭后,队列自动删除result = channel.queue_declare('',exclusive=True)# 声明exchange,由exchange指定消息在哪个队列传递,如不存在,则创建。durable = True 代表exchange持久化存储,False 非持久化存储channel.exchange_declare(exchange = 'python-test',durable = True, exchange_type='fanout')# 绑定exchange和队列  exchange 使我们能够确切地指定消息应该到哪个队列去channel.queue_bind(exchange = 'python-test',queue = result.method.queue)# 定义一个回调函数来处理消息队列中的消息,这里是打印出来def callback(ch, method, properties, body):    ch.basic_ack(delivery_tag = method.delivery_tag)    print(body.decode())channel.basic_consume(result.method.queue,callback,# 设置成 False,在调用callback函数时,未收到确认标识,消息会重回队列。True,无论调用callback成功与否,消息都被消费掉                      auto_ack = False)channel.start_consuming()

模式二:direct

这种工作模式的原理是 消息发送至 exchange,exchange 根据 路由键(routing_key)转发到相对应的 queue 上。

  • 可以使用默认 exchange =' ' ,也可以自定义 exchange

  • 这种模式下不需要将 exchange 和 任何进行绑定,当然绑定也是可以的。可以将 exchange 和 queue ,routing_key 和 queue 进行绑定

  • 传递或接受消息时 需要 指定 routing_key

  • 需要先启动 订阅者,此模式下的队列是 consumer 随机生成的,发布者 仅仅发布消息到 exchange ,由 exchange 转发消息至 queue。

发布者:

import pikaimport jsoncredentials = pika.PlainCredentials('shampoo', '123456')  # mq用户名和密码# 虚拟队列需要指定参数 virtual_host,如果是默认的可以不填。connection = pika.BlockingConnection(pika.ConnectionParameters(host = '10.1.62.170',port = 5672,virtual_host = '/',credentials = credentials))channel=connection.channel()# 声明exchange,由exchange指定消息在哪个队列传递,如不存在,则创建。durable = True 代表exchange持久化存储,False 非持久化存储channel.exchange_declare(exchange = 'python-test',durable = True, exchange_type='direct')for i in range(10):    message=json.dumps({'OrderId':"1000%s"%i})# 指定 routing_key。delivery_mode = 2 声明消息在队列中持久化,delivery_mod = 1 消息非持久化    channel.basic_publish(exchange = 'python-test',routing_key = 'OrderId',body = message,                          properties=pika.BasicProperties(delivery_mode = 2))    print(message)connection.close()

消费者:

import pikacredentials = pika.PlainCredentials('shampoo', '123456')connection = pika.BlockingConnection(pika.ConnectionParameters(host = '10.1.62.170',port = 5672,virtual_host = '/',credentials = credentials))channel = connection.channel()# 创建临时队列,队列名传空字符,consumer关闭后,队列自动删除result = channel.queue_declare('',exclusive=True)# 声明exchange,由exchange指定消息在哪个队列传递,如不存在,则创建。durable = True 代表exchange持久化存储,False 非持久化存储channel.exchange_declare(exchange = 'python-test',durable = True, exchange_type='direct')# 绑定exchange和队列  exchange 使我们能够确切地指定消息应该到哪个队列去channel.queue_bind(exchange = 'python-test',queue = result.method.queue,routing_key='OrderId')# 定义一个回调函数来处理消息队列中的消息,这里是打印出来def callback(ch, method, properties, body):    ch.basic_ack(delivery_tag = method.delivery_tag)    print(body.decode())#channel.basic_qos(prefetch_count=1)# 告诉rabbitmq,用callback来接受消息channel.basic_consume(result.method.queue,callback,# 设置成 False,在调用callback函数时,未收到确认标识,消息会重回队列。True,无论调用callback成功与否,消息都被消费掉                      auto_ack = False)channel.start_consuming()

模式三:topicd

  这种模式和第二种模式差不多,exchange 也是通过 路由键 routing_key 来转发消息到指定的 queue 。 不同点是 routing_key 使用正则表达式支持模糊匹配,但匹配规则又与常规的正则表达式不同,比如“#”是匹配全部,“*”是匹配一个词。

举例:routing_key =“#orderid#”,意思是将消息转发至所有 routing_key 包含 “orderid” 字符的队列中。代码和模式二 类似,就不贴出来了。

以上就是关于“python操作RabbitMq的三种工作模式是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网Python频道。

--结束END--

本文标题: python操作RabbitMq的三种工作模式是什么

本文链接: https://www.lsjlt.com/news/326896.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python操作RabbitMq的三种工作模式是什么
    这篇“python操作RabbitMq的三种工作模式是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python操作Ra...
    99+
    2023-06-30
  • python操作RabbitMq的三种工作模式
    目录一、简介:二、RabbitMq 生产和消费三、RabbitMq 持久化四、RabbitMq 发布与订阅模式一:fanout模式二:direct模式三:topicd一、简介: Ra...
    99+
    2022-11-10
  • SELinux的三种工作模式是什么
    这篇文章主要介绍“SELinux的三种工作模式是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SELinux的三种工作模式是什么”文章能帮助大家解决问题。 ...
    99+
    2023-02-13
    selinux
  • Git工作流演示及三种工作方式是什么
    本文小编为大家详细介绍“Git工作流演示及三种工作方式是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Git工作流演示及三种工作方式是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。集中式工作流(不常用)...
    99+
    2023-06-30
  • SpringBoot整合RabbitMQ实现六种工作模式的示例
    目录前提概念生产者队列消费者SpringBoot整合RabbitMQ基本配置添加maven依赖1. 简单(simple)模式2. 工作模式生产消息:3. 发布订阅模式特点创建队列、交...
    99+
    2022-11-13
  • RabbitMQ的工作原理是什么
    这篇文章给大家介绍RabbitMQ的工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。RabbitMQ简介在介绍RabbitMQ之前实现要介绍一下MQ,MQ是什么?MQ全称是Message Queue,可以理...
    99+
    2023-06-19
  • Python种导入模块的三种方式是什么
    本篇内容介绍了“Python种导入模块的三种方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  1 . import  >&g...
    99+
    2023-06-02
  • 用python操作浏览器的三种方式
    第一种:selenium导入浏览器驱动,用get方法打开浏览器,例如: import time from selenium import webdriver def mac():     driver = webdriver.Fire...
    99+
    2023-01-31
    三种 浏览器 操作
  • Redis的三种模式是什么
    Redis的三种模式是什么?可能很多人对此没有深入了解过,故而小编总结了这篇文章,通过这文章的讲解,希望你能够收获更多知识。standaloan(单机模式)standaloan 是redis单机模式,及所有...
    99+
    2022-10-18
  • linux vim工作模式是什么
    这篇文章主要介绍“linux vim工作模式是什么”,在日常操作中,相信很多人在linux vim工作模式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux vi...
    99+
    2023-02-07
    linux vim
  • 晶体三极管的三种工作状态分别是什么
    这篇文章给大家分享的是有关晶体三极管的三种工作状态分别是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。晶体管的三种工作状态是:1、截止状态,当加在三极管发射结的电压小于PN结的导通电压时,集电极和发射极之间相...
    99+
    2023-06-08
  • 云服务器的三种模式是什么模式
    云服务器的三种模式包括:按需使用(Distributed Access)、按需分配(Distributed Priority)、按需存储(Distributed Storage)。这三种模式是云计算中非常重要的服务模式,它们分别代表了云服务...
    99+
    2023-10-26
    模式 三种 服务器
  • Vim的三种常见模式是什么
    这篇文章主要介绍了Vim的三种常见模式是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vim的三种常见模式是什么文章都会有所收获,下面我们一起来看看吧。安装VIM# yum instal...
    99+
    2023-06-28
  • 云服务器的三种模式是什么模式啊
    云服务器的三种模式分别为:按需服务、按使用量付费和按数据存储量付费。在不同的模式下,云服务器会提供不同的服务类型,比如按量付费模式下只提供存储服务,按使用量付费模式下只提供计算服务等。以下是其中的一些主要区别: 按量付费模式下通常提供按量...
    99+
    2023-10-26
    模式 三种 服务器
  • 云服务器的三种模式是什么
    云服务器是一种虚拟化服务,通常通过互联网连接到公共云计算平台。它允许用户从本地计算资源(如本地数据中心或云数据中心)访问公共云资源,并为用户提供弹性、可靠和快速的服务。 以下是云服务器的三种模式: 私有云模式:私有云计算平台是一个独立的...
    99+
    2023-10-26
    三种 模式 服务器
  • 代理服务器的工作模式是什么
    代理服务器的工作模式:代理服务器与客户端创建连接,根据代理协议请求对目标服务器创建连接或获得目标服务器的指定资源,对目标服务器的资源下载至本地缓存,若客户端所要获取的资源在代理服务器的缓存中,代理服务器不会向目标服务器发送请求,直接返回缓存...
    99+
    2022-10-20
  • 工作中的设计模式门面模式是什么意思
    这篇文章主要介绍“工作中的设计模式门面模式是什么意思”,在日常操作中,相信很多人在工作中的设计模式门面模式是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”工作中的设计...
    99+
    2022-10-19
  • python命令模式的作用是什么
    python命令模式的作用是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python有哪些常用库python常用的库:1.requesuts;2.scrapy;3.pil...
    99+
    2023-06-14
  • Go1.18多模块Multi-Module工作区模式是什么
    本文小编为大家详细介绍“Go1.18多模块Multi-Module工作区模式是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go1.18多模块Multi-Module工作区模式是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-06-29
  • php中fpm的三种模式分别是什么
    这篇文章主要介绍“php中fpm的三种模式分别是什么”,在日常操作中,相信很多人在php中fpm的三种模式分别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中fpm的三种模式分别是什么”的疑惑有所...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作