当前位置: 首页 > news >正文

基于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

image.png

安装完成后,可以通过访问 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()
  1. 创建一个ConnectionParameters实例,定义了与RabbitMQ服务器建立连接所需的参数:
    • host='localhost':指定RabbitMQ服务器的主机名,这里是本地主机。
    • heartbeat=3600:心跳间隔,单位为秒,用于保持连接的活跃性。
    • blocked_connection_timeout=300:如果连接被阻塞,这个参数定义了连接超时的时间,单位为秒。
  2. connection = pika.BlockingConnection(...):使用pika.BlockingConnection创建一个到RabbitMQ的阻塞连接。这意味着连接操作会等待直到成功建立连接。
  3. channel = connection.channel():创建一个新的通信信道。在RabbitMQ中,信道是进行消息传递的通道。
  4. channel.queue_declare(queue='hello'):声明一个名为hello的队列。如果该队列不存在,RabbitMQ会创建它。
  5. channel.basic_publish(exchange='', routing_key='hello', body='Hello World!'):发布(发送)一条消息到队列。参数说明:
    • exchange:交换机名称,这里为空字符串,表示使用默认的交换机。
    • routing_key:路由键,这里与队列名相同,表示消息将直接发送到hello队列。
    • body:消息体,这里是字符串'Hello World!'

image.png

消费消息

接下来,看一下如何从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)
  1. 定义一个名为callback的函数,它将作为消费消息时的回调函数。当消息到达时,这个函数会被调用,并打印出消息体。
  2. channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True):开始消费hello队列中的消息。on_message_callback参数指定了当消息到达时调用的回调函数,auto_ack=True表示自动确认消息。

image.png

结论

本文介绍了如何在 Python 中使用 RabbitMQ 进行消息发送和消费。RabbitMQ 是异步消息传递的强有力工具,适用于构建可靠、可伸缩的分布式系统。随着微服务架构的流行,RabbitMQ 在现代软件开发中的作用越来越重要。

相关文章:

基于RabbitMQ的异步消息传递:发送与消费

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

Golang | Leetcode Golang题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; func rangeBitwiseAnd(m int, n int) int {for m < n {n & (n - 1)}return n }...

竞争性谈判中,主要谈判什么内容?(电子化招采系统)

问&#xff1a;竞争性谈判中&#xff0c;主要谈判什么内容&#xff1f; 答&#xff1a;竞争性谈判是指采购人或代理机构通过与多家供应商&#xff08;不少于3家&#xff09;进行谈判&#xff0c;最后从中确定中标供应商的一种采购方式。在谈判的过程中&#xff0c;谈判的主要内…...

youlai-boot项目的学习(4) 前后端本地部署

环境 1、macOS, brew, IntelliJ IDEA, WebStrom 2、后端&#xff1a;https://gitee.com/youlaiorg/youlai-boot.git , master, 9a753a2e94985ed4cbbf214156ca035082e02723 3、前端&#xff1a;https://gitee.com/youlaiorg/vue3-element-admin.git, master, 66b913ef01dc880ad…...

Redis 5 种基础数据结构?

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

搜维尔科技:SenseGlove Nova2国内首款支持手掌心力回馈手套开售

《SenseGlove Nova 2》现正全球发行中! 搜维尔科技独家代理最新上市的 SenseGlove Nova 2 是世上首款&#xff0c;也是目前市面上唯一一款提供手掌力回馈的无缐VR力回馈手套&#xff0c;它结合了三种最先进的反馈技术&#xff0c;包括主动反馈、强力反馈及震动反馈&#xff0c…...

Java中的函数式编程入门

Java中的函数式编程入门 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我来为大家介绍一下Java中的函数式编程。随着Java 8的发布&#xff0c;函数式编程成…...

idea 自动生成序列化数字

目标&#xff1a;当类继承Serializable后自动生成序列化Uid 网上查了很多说勾选class without ‘serialVersionUID’ 但是我勾选没用 最后发现&#xff0c;我勾选的是Serialization issues里面的配置&#xff0c;要勾选的是JVM languages下的 如下图所示&#xff0c;记录一下…...

Java数据结构算法(最长递增序列二分查找)

前言: 最长递增子序列&#xff08;Longest Increasing Subsequence, LIS&#xff09;是指在一个给定的序列中&#xff0c;找到一个最长的子序列&#xff0c;使得这个子序列中的元素是单调递增的。子序列不要求在原序列中连续。 实现原理 使用一个 tails 列表&#xff0c;其中…...

编译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装饰器&#xff1a;深入理解与应用 在Python中&#xff0c;property装饰器是一个强大的工具&#xff0c;它允许我们将方法作为属性来访问&#xff0c;使得代码更加简洁、清晰&#xff0c;并提供了更好的封装性。本文将深入探讨property装饰器的工作原理、应…...

springCloudalibabaAI孵化(一)

目录 1、what 1、简介 2、核心概念 3、高级特性 Prompt 和 AiResponse 4、功能 2、How 1、前言 2、在项目 pom.xml 中加入 2023.0.1.0 版本 Spring Cloud Alibaba 依赖&#xff1a; 3、在 配置文件中加入以下配置&#xff1a;application.yml 4、编写聊天服务实现类&a…...

【封装】Unity编辑器模式GUID加载资源

介绍 在编辑器模式下通过GUID获取工程目录下的指定资源的接口工具封装 工具原理 借助AssetDatabaseAPI FindAssets : 获取 GUID GUIDToAssetPath : 通过GUID获取路径LoadAssetAtPath<T>: 通过路径加载资源 代码&#xff1a; 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.重新均衡分片数据 如有必要&#xff0c;可以通过在分片间移动数据来达到负载均衡。举个例子&#xff0c;许多读者可能听一些大型图片分享网站或流行社区网站的开发者提到过用于分片间移动用户数据的工具。在分片间移动数据的好处很明显。例如&#xff…...

C++ | Leetcode C++题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; 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;// 快慢指针&#xff0c;找环的相遇位置do{slow ProductSum(slow)…...

NIST网络安全框架体系应用

NIST网络安全框架体系应用 NIST网络安全框架&#xff08;NIST Cybersecurity Framework, NIST CSF&#xff09;由美国国家标准与技术研究院&#xff08;NIST&#xff09;发布&#xff0c;是一套广泛应用于各种组织的网络安全管理指南。该框架通过识别、保护、检测、响应和恢复…...

【LeetCode】七、树、堆、图

文章目录 1、树结构2、二叉树3、二叉树的遍历4、堆结构&#xff08;Heap&#xff09;5、堆化6、图 1、树结构 节点、根节点、叶子节点&#xff1a; 高度、深度、层三者的示意图&#xff1a; 2、二叉树 相比其他树&#xff0c;二叉树即每个节点最多两个孩子&#xff08;两个分…...

FPGA PCIe加载提速方案

目录 1.bit流压缩 2.flash加载速度 3.Tandem模式 1.bit流压缩 set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] 2.flash加载速度 打开bitstream setting&#xff0c;设置SPI的线宽和速率&#xff08;线宽按原理图设置&#xff0c;速率尽可能高&#xff09…...

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…...

开源编解码工具技术选型与实战指南:跨场景应用的H.264解决方案

开源编解码工具技术选型与实战指南&#xff1a;跨场景应用的H.264解决方案 【免费下载链接】openh264 Open Source H.264 Codec 项目地址: https://gitcode.com/gh_mirrors/op/openh264 一、价值定位&#xff1a;为什么开源编解码工具是技术选型的最优解 在视频技术快…...

深度学习标量、向量、矩阵与张量(三)

1. 定位导航 线性代数是深度学习最核心的数学工具——没有之一。神经网络的前向传播本质上就是矩阵乘法加非线性激活&#xff1b;反向传播本质上就是链式法则在矩阵/向量上的应用&#xff1b;PCA、SVD、特征分解等工具贯穿从数据预处理到模型分析的全过程。 本篇是最基础的一篇…...

如何让扫描PDF变得可搜索?OCRmyPDF-Desktop完整解决方案

如何让扫描PDF变得可搜索&#xff1f;OCRmyPDF-Desktop完整解决方案 【免费下载链接】pdfocr-desktop PDF OCR Application, adds an OCR text layer to scanned PDF files, allowing them to be copied and searched. 项目地址: https://gitcode.com/gh_mirrors/oc/pdfocr-d…...

告别手动画框!OrCAD Capture 快速创建复合封装(附电源/地引脚处理技巧)

高效创建OrCAD复合封装的进阶技巧与避坑指南 在PCB设计流程中&#xff0c;原理图封装的创建往往是项目前期最耗时的环节之一。尤其是面对多通道运放、复杂电源管理芯片或模块化器件时&#xff0c;传统的手动绘制方式不仅效率低下&#xff0c;还容易因引脚属性设置不当导致后续D…...

深度学习迁移学习:从原理到实践

深度学习迁移学习&#xff1a;从原理到实践 1. 背景与动机 深度学习模型在各种任务上取得了显著的性能提升&#xff0c;但这些模型通常需要大量的标注数据和计算资源进行训练。在实际应用中&#xff0c;我们经常面临以下挑战&#xff1a; 数据不足&#xff1a;某些任务的标注数…...

实战应用:开发Win11右键菜单管理器——从快马AI生成完整项目开始

实战应用&#xff1a;开发Win11右键菜单管理器——从快马AI生成完整项目开始 最近帮朋友解决Win11右键菜单恢复问题&#xff0c;发现网上教程都是手动改注册表&#xff0c;既麻烦又容易出错。作为开发者&#xff0c;我决定用C#写个可视化工具来管理右键菜单。这个需求其实很典…...

OpenClaw自动化测试:百川2-13B驱动的前端元素定位与交互验证

OpenClaw自动化测试&#xff1a;百川2-13B驱动的前端元素定位与交互验证 1. 从手工测试到智能测试的进化之路 作为一名长期奋战在前端测试一线的开发者&#xff0c;我经历过从纯手工点击到Selenium脚本&#xff0c;再到Playwright框架的技术迭代。每次升级都带来效率提升&…...

ABC系统实战指南:革新数字电路设计的逻辑综合与形式验证技术突破

ABC系统实战指南&#xff1a;革新数字电路设计的逻辑综合与形式验证技术突破 【免费下载链接】abc ABC: System for Sequential Logic Synthesis and Formal Verification 项目地址: https://gitcode.com/gh_mirrors/ab/abc 在现代集成电路设计流程中&#xff0c;工程师…...

Python内存泄漏分析实战指南(生产环境零停机排查全流程)

第一章&#xff1a;Python内存泄漏的本质与危害Python内存泄漏并非源于C语言中常见的“未释放malloc内存”&#xff0c;而是指对象被意外长期持有&#xff0c;导致垃圾回收器&#xff08;GC&#xff09;无法将其回收&#xff0c;从而持续占用堆内存。其本质是**引用关系的非预期…...

gemma-3-12b-it实际作品:10张不同领域测试图的图文理解准确率统计表

gemma-3-12b-it实际作品&#xff1a;10张不同领域测试图的图文理解准确率统计表 1. 测试背景与方法 最近我在实际使用gemma-3-12b-it模型时&#xff0c;对其图文理解能力产生了浓厚兴趣。这个由Google推出的多模态模型号称能够同时处理文本和图像输入&#xff0c;并生成准确的…...