关于Python如何操作消息队列(RabbitMQ)的方法教程

rabbitmq是一个在amqp基础上完整的,可复用的企业消息系统。他遵循mozilla public license开源协议。下面这篇文章主要给大家介绍了关于利用python操作消息队列rabbitmq的方法教程,需要的朋友可以参考下。

前言

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

应用场景:

RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具。消息队列的使用场景大概有3种:

立即学习“Python免费学习笔记(深入)”;

     1、系统集成,分布式系统的设计。各种子系统通过消息来对接,这种解决方案也逐步发展成一种架构风格,即“通过消息传递的架构”。

     2、当系统中的同步处理方式严重影响了吞吐量,比如日志记录。假如需要记录系统中所有的用户行为日志,如果通过同步的方式记录日志势必会影响系统的响应速度,当我们将日志消息发送到消息队列,记录日志的子系统就会通过异步的方式去消费日志消息。

     3、系统的高可用性,比如电商的秒杀场景。当某一时刻应用服务器或数据库服务器收到大量请求,将会出现系统宕机。如果能够将请求转发到消息队列,再由服务器去消费这些消息将会使得请求变得平稳,提高系统的可用性。

一、安装环境

首先是在 Linux 上安装 rabbitmq

# 环境为CentOS 7yum install rabbitmq-server # 安装RabbitMQsystemctl start rabbitmq-server # 启动systemctl enable rabbitmq-server # 开机自启systemctl stop firewall-cmd  # 临时关闭防火墙

登录后复制

然后用 pip 安装 Python3 的开发包

pip3 install pika

登录后复制

安装好软件之后可以访问http://115.xx.xx.xx:15672/来访问自带的 web 页面来查看和管理 RabbitMQ。默认管理员的用户密码都是guest

二、简单的向队列中加入消息

#!/usr/bin/env python3# coding=utf-8# @Time : 2017/6/13 19:25# @Author : Shawn# @Blog : https://blog.just666.cn# @Email : shawnbluce@gmail.com# @purpose : RabbitMQ_Producerimport pika# 创建连接对象connection = pika.BlockingConnection(pika.ConnectionParameters(host='115.xx.xx.xx'))# 创建频道对象channel = connection.channel()# 指定一个队列,如果该队列不存在则创建channel.queue_declare(queue='test_queue')# 提交消息for i in range(10): channel.basic_publish(exchange='', routing_key='test_queue', body='hello,world' + str(i)) print("sent...")# 关闭连接connection.close()

登录后复制

三、简单的从队列中获取消息

#!/usr/bin/env python3# coding=utf-8# @Time : 2017/6/13 19:40# @Author : Shawn# @Blog : https://blog.just666.cn# @Email : shawnbluce@gmail.com# @purpose : RabbitMQ_Consumerimport pikacredentials = pika.PlainCredentials('guest', 'guest')# 连接到RabbitMQ服务器connection = pika.BlockingConnection(pika.ConnectionParameters('115.xx.xx.xx', 5672, '/', credentials))channel = connection.channel()# 指定一个队列,如果该队列不存在则创建channel.queue_declare(queue='test_queue')# 定义一个回调函数def callback(ch, method, properties, body): print(body.decode('utf-8'))# 告诉RabbitMQ使用callback来接收信息channel.basic_consume(callback, queue='test_queue', no_ack=False)print('waiting...')# 开始接收信息,并进入阻塞状态,队列里有信息才会调用callback进行处理。按ctrl+c退出。channel.start_consuming()

登录后复制

四、万一消费者掉线了

想象这样一种情况:

消费者从消息队列中获取了 n 条数据,正要处理呢结果宕机了,那该怎么办?在 RabbieMQ 中有一个 ACK 可以用来确认消费者处理结束。就有点类似网络中的 ACK,消费者每次从队列中获取了数据之后队列不会立刻将数据移除,而是等待对应的 ACK。消费者获取到数据并处理完成之后会向队列发送一个 ACK 包,通知 RabbitMQ 这堆消息已经处理妥当了,可以删除了,这时候 RabbitMQ 才会将数据从队列中移除。所以这种情况下即使消费者掉线也没有什么问题,数据依旧会在队列中存在,留给其他消费者处理。

在 Python 中这样实现:

消费者有这样一行代码channel.basic_consume(callback, queue=’test_queue’, no_ack=False) ,其中no_ack=False表示不发送确认包。将其修改为no_ack=True就会在每次处理完之后向 RabbitMQ 发送一个确认包,以确认消息处理完毕。

五、万一 RabbitMQ 宕机了呢

虽然有了 ACK 包,但是万一 RabbitMQ 挂了那数据还是会损失。所以我们可以给 RabbitMQ 设置一个数据持久化存储。RabbitMQ 会将数据持久化存储到磁盘上,保证下次再启动的时候队列还在。

在 Python 中这样实现:

我们声明一个队列是这样的channel.queue_declare(queue=’test_queue’) ,如果需要持久化一个队列可以这样声明channel.queue_declare(queue=’test_queue’, durable=True) 。不过这行直接放在代码中是不能执行的,因为以前已经有了一个名为test_queue的队列,RabbitMQ 不允许用不同的方式声明同一个队列,所以可以换一个队列名新建来指定数据持久化存储。不过如果只是这样声明的话,在 RabbitMQ 宕机重启后确实队列还在,不过队列里的数据就没有了。除非我们这样来声明队列channel.basic_publish(exchange=”, routing_key=”test_queue”, body=message, properties=pika.BasicProperties(delivery_mode = 2,)) 。

六、最简单的发布订阅

最简单的发布订阅在 RabbitMQ 中称之为Fanout模式。也就是说订阅者订阅某个频道,然后发布者向这个频道中发布消息,所有订阅者就都能接收到这条消息。不过因为发布者需要使用订阅者创建的随机队列所以需要先启动订阅者才能启动发布者。

发布者代码:

#!/usr/bin/env python3# coding=utf-8# @Time : 2017/6/13 20:21# @Author : Shawn# @Blog : https://blog.just666.cn# @Email : shawnbluce@gmail.com# @purpose : RabbitMQ_Publisherimport pika# 创建连接对象connection = pika.BlockingConnection(pika.ConnectionParameters(host='115.xx.xx.xx'))# 创建频道对象channel = connection.channel()# 定义交换机,exchange表示交换机名称,type表示类型channel.exchange_declare(exchange='my_fanout',       type='fanout')message = 'Hello Python'# 将消息发送到交换机channel.basic_publish(exchange='my_fanout', # 指定exchange      routing_key='', # fanout下不需要配置,配置了也不会生效      body=message)connection.close()

登录后复制

订阅者代码:

#!/usr/bin/env python3# coding=utf-8# @Time : 2017/6/13 20:20# @Author : Shawn# @Blog : https://blog.just666.cn# @Email : shawnbluce@gmail.com# @purpose : RabbitMQ_Subscriberimport pikacredentials = pika.PlainCredentials('guest', 'guest')# 连接到RabbitMQconnection = pika.BlockingConnection(pika.ConnectionParameters('115.xx.xx.xx', 5672, '/', credentials))channel = connection.channel()# 定义交换机,进行exchange声明,exchange表示交换机名称,type表示类型channel.exchange_declare(exchange='my_fanout',       type='fanout')# 随机创建队列result = channel.queue_declare(exclusive=True) # exclusive=True表示建立临时队列,当consumer关闭后,该队列就会被删除queue_name = result.method.queue# 将队列与exchange进行绑定channel.queue_bind(exchange='my_fanout',     queue=queue_name)# 定义回调方法def callback(ch, method, properties, body): print(body.decode('utf-8'))# 从队列获取信息channel.basic_consume(callback,      queue=queue_name,      no_ack=True)channel.start_consuming()

登录后复制

总结

以上就是关于Python如何操作消息队列(RabbitMQ)的方法教程的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2267751.html

(0)
上一篇 2025年2月27日 10:16:12
下一篇 2025年2月18日 06:58:31

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 大学计算机基础学什么内容

    大学计算机基础课程涵盖以下核心主题:计算基础、计算机系统组成、数据表示和处理、算法和数据结构、编程语言(面向对象编程)、操作系统、数据库系统、计算机网络,以及软件工程、计算思维等。 大学计算机基础学习内容 大学计算机基础课程涵盖以下核心主题…

    2025年2月27日
    000
  • 关于普通计算机语言基本构成要素

    普通计算机语言由以下基本要素构成:关键词指定程序结构和任务。数据类型定义允许的数据值。变量存储值。运算符执行数学或逻辑操作。控制流语句控制程序执行顺序。函数是可重用的代码块。数据结构组织和存储数据。 普通计算机语言的基本构成要素 普通计算机…

    2025年2月27日
    200
  • Python如何实现组织算法pairwise(高效测试用例)

    下面小编就为大家带来一篇高效测试用例组织算法pairwise之python实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 开篇: 测试过程中,对于多参数参数多值的情况进行测试用例组织,之前一直使用【正…

    2025年2月27日
    200
  • 五种常见的计算机高级语言

    最常见的五种高级计算机语言包括:1. Python(解释型、面向对象,适用于初学者和 Web 开发);2. Java(编译型、面向对象,可跨平台运行);3. C++(编译型、通用,用于操作系统和高性能计算);4. JavaScript(解释…

    2025年2月27日
    200
  • 关于Python如何实现登录接口的方法分享

    本篇文章主要介绍了python实现登录接口的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 之前写了Python实现登录接口的示例代码,最近需要回顾,就顺便发到随笔上了 要求: 1.输入用户名和密码 2…

    2025年2月27日
    200
  • 计算机技能常用语言有哪些

    计算机技能常用的编程语言分为高级语言和低级语言两类。高级语言使用类似人类语言的语法,例如 Java、Python、C# 和 JavaScript,适合初学者和广泛应用。低级语言与计算机硬件直接交互,例如汇编语言和机器语言,难度更大 but …

    2025年2月27日
    200
  • 属于计算机程序语言的是

    以下是计算机程序语言的类型:高级语言:C、C++、Java、Python、JavaScript汇编语言机器语言脚本语言:Bash、Python、Perl 属于计算机程序语言的是 计算机程序语言是用于与计算机通信并控制其行为的正式语言。而属于…

    2025年2月27日
    200
  • Python中关于复数属性以及方法运算的示例

    这篇文章主要介绍了python复数属性和方法运算操作,结合实例形式分析了python复数运算相关操作技巧,代码注释备有详尽说明,需要的朋友可以参考下 本文实例讲述了Python复数属性和方法运算操作。分享给大家供大家参考,具体如下: #co…

    2025年2月27日
    200
  • 计算机语言最常用的是哪几个语言

    最常用的计算机语言分别是:Python、C++、Java、JavaScript、C#,它们因易用、面向对象、跨平台、适合脚本编写和游戏开发等特点,广泛应用于各种领域,包括软件开发、数据分析和游戏开发。 最常用的计算机语言 计算机语言是人与计…

    2025年2月27日
    200
  • Python关于列表的创建使用以及更新删除的实例

    这篇文章主要介绍了python编程之列表操作,结合实例形式分析了python列表的创建、使用、更新、删除等实现方法与相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python列表操作。分享给大家供大家参考,具体如下: #coding=u…

    2025年2月27日
    200

发表回复

登录后才能评论