基于RabbitMQ的异步消息传递:发送与消费
引言
RabbitMQ是一个流行的开源消息代理,用于在分布式系统中实现异步消息传递。它基于Erlang语言编写,具有高可用性和可伸缩性。在本文中,我们将探讨如何在Python中使用RabbitMQ进行消息发送和消费。
安装RabbitMQ
在 Ubuntu 上安装 RabbitMQ 可以通过多种方式完成,包括使用包管理器、Docker 容器或从源代码编译。以下是最简单和最常见的方法,使用包管理器进行安装。
安装 Erlang:
添加 PPA 之后,可以安装 Erlang。
sudo apt install erlang
安装 RabbitMQ:
在 Erlang 安装完成后,可以安装 RabbitMQ。
sudo apt install rabbitmq-server
启动 RabbitMQ:
安装完成后,可以启动 RabbitMQ 服务。
sudo systemctl start rabbitmq-server
设置 RabbitMQ 用户:
为了安全起见,应该创建一个 RabbitMQ 用户。
sudo rabbitmqctl add_user your_username your_password
sudo rabbitmqctl set_permissions -p / your_username ".*" ".*" ".*"
sudo rabbitmqctl set_user_tags your_username administrator
sudo rabbitmqctl set_permissions -p / your_username ".*" ".*" ".*"
在这里,your_username
是想要创建的用户名,your_password
是该用户的密码。
检查 RabbitMQ 状态:
使用以下命令检查 RabbitMQ 服务状态。
sudo systemctl status rabbitmq-server
配置 RabbitMQ 防火墙:
根据您的网络配置,可能需要配置防火墙规则以允许外部客户端访问 RabbitMQ。
sudo ufw allow from any to any port 5672 proto tcp
sudo ufw allow from any to any port 15672 proto tcp
停止 RabbitMQ:
如果想要停止 RabbitMQ 服务,可以使用以下命令。
sudo systemctl stop rabbitmq-server
查看 RabbitMQ 版本:
使用以下命令查看已安装的 RabbitMQ 版本。
sudo rabbitmq-server -v
安装完成后,可以通过访问 http://localhost:15672
来访问 RabbitMQ 管理界面。如果已经设置了用户,将需要使用创建的用户名和密码登录。请注意,RabbitMQ 服务器配置和安全性是复杂的主题,上述步骤提供了基本的安装和配置指南。根据具体需求,可能需要进行更详细的配置。
安装pika
pika
是一个用于 RabbitMQ 的 Python 客户端库,它允许创建和控制 RabbitMQ 队列、交换器、绑定和消息。安装也非常简单,安装完成后,就可以在 Python 代码中导入 pika
库并使用它来与 RabbitMQ 交互。
pip install pika
发送消息
首先,来看一下如何发送消息到RabbitMQ队列。以下代码片段展示了如何连接到RabbitMQ服务器,声明一个队列,并发布一个消息到该队列。
#!/usr/bin/env python
import pikaparams = pika.ConnectionParameters(host='localhost', heartbeat=3600, blocked_connection_timeout=300)
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()
- 创建一个
ConnectionParameters
实例,定义了与RabbitMQ服务器建立连接所需的参数:host='localhost'
:指定RabbitMQ服务器的主机名,这里是本地主机。heartbeat=3600
:心跳间隔,单位为秒,用于保持连接的活跃性。blocked_connection_timeout=300
:如果连接被阻塞,这个参数定义了连接超时的时间,单位为秒。
connection = pika.BlockingConnection(...)
:使用pika.BlockingConnection
创建一个到RabbitMQ的阻塞连接。这意味着连接操作会等待直到成功建立连接。channel = connection.channel()
:创建一个新的通信信道。在RabbitMQ中,信道是进行消息传递的通道。channel.queue_declare(queue='hello')
:声明一个名为hello
的队列。如果该队列不存在,RabbitMQ会创建它。channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
:发布(发送)一条消息到队列。参数说明:exchange
:交换机名称,这里为空字符串,表示使用默认的交换机。routing_key
:路由键,这里与队列名相同,表示消息将直接发送到hello
队列。body
:消息体,这里是字符串'Hello World!'
。
消费消息
接下来,看一下如何从RabbitMQ队列中消费消息。以下代码片段展示了如何连接到RabbitMQ服务器,声明一个队列,并使用回调函数来处理收到的消息。
#!/usr/bin/env python
import pika, sys, osdef main():connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))channel = connection.channel()channel.queue_declare(queue='hello')def callback(ch, method, properties, body):print(" [x] Received %r" % body)channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)print(' [*] Waiting for messages. To exit press CTRL+C')channel.start_consuming()if __name__ == '__main__':try:main()except KeyboardInterrupt:print('Interrupted')try:sys.exit(0)except SystemExit:os._exit(0)
- 定义一个名为
callback
的函数,它将作为消费消息时的回调函数。当消息到达时,这个函数会被调用,并打印出消息体。 channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)
:开始消费hello
队列中的消息。on_message_callback
参数指定了当消息到达时调用的回调函数,auto_ack=True
表示自动确认消息。
结论
本文介绍了如何在 Python 中使用 RabbitMQ 进行消息发送和消费。RabbitMQ 是异步消息传递的强有力工具,适用于构建可靠、可伸缩的分布式系统。随着微服务架构的流行,RabbitMQ 在现代软件开发中的作用越来越重要。
相关文章:

基于RabbitMQ的异步消息传递:发送与消费
引言 RabbitMQ是一个流行的开源消息代理,用于在分布式系统中实现异步消息传递。它基于Erlang语言编写,具有高可用性和可伸缩性。在本文中,我们将探讨如何在Python中使用RabbitMQ进行消息发送和消费。 安装RabbitMQ 在 Ubuntu 上安装 Rabbi…...

Golang | Leetcode Golang题解之第201题数字范围按位与
题目: 题解: func rangeBitwiseAnd(m int, n int) int {for m < n {n & (n - 1)}return n }...
竞争性谈判中,主要谈判什么内容?(电子化招采系统)
问:竞争性谈判中,主要谈判什么内容? 答:竞争性谈判是指采购人或代理机构通过与多家供应商(不少于3家)进行谈判,最后从中确定中标供应商的一种采购方式。在谈判的过程中,谈判的主要内…...

youlai-boot项目的学习(4) 前后端本地部署
环境 1、macOS, brew, IntelliJ IDEA, WebStrom 2、后端:https://gitee.com/youlaiorg/youlai-boot.git , master, 9a753a2e94985ed4cbbf214156ca035082e02723 3、前端:https://gitee.com/youlaiorg/vue3-element-admin.git, master, 66b913ef01dc880ad…...

Redis 5 种基础数据结构?
Redis 5 种基本数据结构(String、List、Hash、Set、Sorted Set)在面试中经常会被问到,这篇文章我们一起来回顾温习一下。 还有几种比较特殊的数据结构(HyperLogLogs、Bitmap 、Geospatial、Stream)也非常重要,我们后面下次再聊! 下面是正文。…...

搜维尔科技:SenseGlove Nova2国内首款支持手掌心力回馈手套开售
《SenseGlove Nova 2》现正全球发行中! 搜维尔科技独家代理最新上市的 SenseGlove Nova 2 是世上首款,也是目前市面上唯一一款提供手掌力回馈的无缐VR力回馈手套,它结合了三种最先进的反馈技术,包括主动反馈、强力反馈及震动反馈,…...
Java中的函数式编程入门
Java中的函数式编程入门 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我来为大家介绍一下Java中的函数式编程。随着Java 8的发布,函数式编程成…...

idea 自动生成序列化数字
目标:当类继承Serializable后自动生成序列化Uid 网上查了很多说勾选class without ‘serialVersionUID’ 但是我勾选没用 最后发现,我勾选的是Serialization issues里面的配置,要勾选的是JVM languages下的 如下图所示,记录一下…...
Java数据结构算法(最长递增序列二分查找)
前言: 最长递增子序列(Longest Increasing Subsequence, LIS)是指在一个给定的序列中,找到一个最长的子序列,使得这个子序列中的元素是单调递增的。子序列不要求在原序列中连续。 实现原理 使用一个 tails 列表,其中…...

编译VTK静态库
编译VTK静态库遇到问题 vtkCommonCore-9.3d.lib(vtkSMPToolsAPI.obj) : error LNK2019: unresolved external symbol "public: bool __cdecl vtk::detail::smp::vtkSMPToolsImpl<1>::IsParallelScope(void)" (?IsParallelScope?$vtkSMPToolsImpl$00smpdetai…...
Python中的@property装饰器:深入理解与应用
Python中的property装饰器:深入理解与应用 在Python中,property装饰器是一个强大的工具,它允许我们将方法作为属性来访问,使得代码更加简洁、清晰,并提供了更好的封装性。本文将深入探讨property装饰器的工作原理、应…...
springCloudalibabaAI孵化(一)
目录 1、what 1、简介 2、核心概念 3、高级特性 Prompt 和 AiResponse 4、功能 2、How 1、前言 2、在项目 pom.xml 中加入 2023.0.1.0 版本 Spring Cloud Alibaba 依赖: 3、在 配置文件中加入以下配置:application.yml 4、编写聊天服务实现类&a…...
【封装】Unity编辑器模式GUID加载资源
介绍 在编辑器模式下通过GUID获取工程目录下的指定资源的接口工具封装 工具原理 借助AssetDatabaseAPI FindAssets : 获取 GUID GUIDToAssetPath : 通过GUID获取路径LoadAssetAtPath<T>: 通过路径加载资源 代码: public static class GetAssetUtil {pub…...

安装 Docker 环境(通过云平台创建一个实例实现)
目录 1. 删除原有 yum 2. 手动配置 yum 源 3. 删除防火墙规则 4. 保存防火墙配置 5. 修改系统内核。打开内核转发功能。 6. 安装 Docker 7. 设置本地镜像仓库 8.重启服务 1. 删除原有 yum rm -rfv /etc/yum.repos.d/* 2. 手动配置 yum 源 使用 centos7-1511.iso 和 Xi…...

MySQL之可扩展性(六)
可扩展性 向外扩展 12.重新均衡分片数据 如有必要,可以通过在分片间移动数据来达到负载均衡。举个例子,许多读者可能听一些大型图片分享网站或流行社区网站的开发者提到过用于分片间移动用户数据的工具。在分片间移动数据的好处很明显。例如ÿ…...

C++ | Leetcode C++题解之第202题快乐数
题目: 题解: class Solution { public:int ProductSum(int n){int sum 0;while(n){int temp n % 10;sum temp*temp;n / 10;}return sum;}bool isHappy(int n) {int slow n,fast n;// 快慢指针,找环的相遇位置do{slow ProductSum(slow)…...
NIST网络安全框架体系应用
NIST网络安全框架体系应用 NIST网络安全框架(NIST Cybersecurity Framework, NIST CSF)由美国国家标准与技术研究院(NIST)发布,是一套广泛应用于各种组织的网络安全管理指南。该框架通过识别、保护、检测、响应和恢复…...

【LeetCode】七、树、堆、图
文章目录 1、树结构2、二叉树3、二叉树的遍历4、堆结构(Heap)5、堆化6、图 1、树结构 节点、根节点、叶子节点: 高度、深度、层三者的示意图: 2、二叉树 相比其他树,二叉树即每个节点最多两个孩子(两个分…...

FPGA PCIe加载提速方案
目录 1.bit流压缩 2.flash加载速度 3.Tandem模式 1.bit流压缩 set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] 2.flash加载速度 打开bitstream setting,设置SPI的线宽和速率(线宽按原理图设置,速率尽可能高)…...

Hi3861 OpenHarmony嵌入式应用入门--轮询按键
本篇介绍使用轮询方式读取gpio状态来判断按键状态。 原理图如下 GPIO API API名称 说明 hi_u32 hi_gpio_init(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO上下拉功能。 hi_u32 hi_gpio_set_dir(hi_gpio_idx id, hi_gpi…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...