当前位置: 首页 > 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…...

js,uni 自定义 时间选择器 vue2

<template><view class"reserve-time-box"><view class"title">选择时间</view><view class"date-box"><view class"date-scroll-box" :style"{ width : ${dataTimeWidth}rpx }"><v…...

搜索引擎的原理与相关知识

搜索引擎是一种网络服务&#xff0c;它通过互联网帮助用户找到所需的信息。搜索引擎的工作原理主要包括以下几个步骤&#xff1a; 网络爬虫&#xff08;Web Crawler&#xff09;&#xff1a;搜索引擎使用网络爬虫&#xff08;也称为蜘蛛或机器人&#xff09;来遍历互联网&#…...

React:tabs或标签页自定义右击菜单内容,支持内嵌iframe关闭菜单方案

React&#xff1a;tabs或标签页自定义右击菜单内容&#xff0c;支持内嵌iframe关闭菜单方案 不管是react、vue还是原生js&#xff0c;原理是一样的。 注意如果内嵌iframe情况下&#xff0c;iframe无法使用事件监听&#xff0c;但是可以使用iframe的任何点击行为都会往父级wind…...

Taro +vue3 中的微信小程序中的分享

微信小程序 右上角分享 的触发 以及配 useShareAppMessage(() > {return {title: "电影属全国通兑券",page: /pages/home/index,imageUrl: "http:///chuanshuo.jpg",};}); 置 就是Taro框架中提供的一个分享Api 封装好的...

视频监控EasyCVR视频汇聚/智能边缘网关:EasySearch无法探测到服务器如何处理?

安防监控EasyCVR智能边缘网关/视频汇聚网关/视频网关属于软硬一体的边缘计算硬件&#xff0c;可提供多协议&#xff08;RTSP/RTMP/国标GB28181/GAT1400/海康Ehome/大华/海康/宇视等SDK&#xff09;的设备接入、音视频采集、视频转码、处理、分发等服务&#xff0c;系统具备实时…...

openlayer 鼠标点击船舶,打开船舶简单弹框

背景&#xff1a; 对创建的地图对象&#xff0c;可以添加上监听事件&#xff0c;常用的有&#xff1a;地图点击事件、鼠标移动事件。 通过监听这些事件&#xff0c;又可以区分不同图层的不同要素&#xff0c;获取不同数据&#xff1b; 根据这些数据&#xff0c;又可以发起网络请…...

数据挖掘常见算法(关联)

Apriori算法 Apriori算法基于频繁项集性质的先验知识&#xff0c;使用由下至上逐层搜索的迭代方法&#xff0c;即从频繁1项集开始&#xff0c;采用频繁k项集搜索频繁k1项集&#xff0c;直到不能找到包含更多项的频繁项集为止。 Apriori算法由以下步骤组成&#xff0c;其中的核…...

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档&#xff1a;https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址&#xff1a;https://github.com/Hufe921/canvas-editor 前提声明&#xff1a; 由于CanvasEditor目前不支持vue、react 等框架开箱即用版&#xff0c;所以…...

Redis Stream Redisson Stream

目录 一、Redis Stream1.1 场景1&#xff1a;多个客户端可以同时接收到消息1.1.1 XADD - 向stream添加Entry&#xff08;发消息 &#xff09;1.1.2 XREAD - 从stream中读取Entry&#xff08;收消息&#xff09;1.1.3 XRANGE - 从stream指定区间读取Entry&#xff08;收消息&…...

threadX netx 设置IP地址以及获取IP地址

ThreadX 是一个实时操作系统&#xff08;RTOS&#xff09;内核&#xff0c;而 NetX 则是 Express Logic 提供的一个嵌入式 TCP/IP 网络栈&#xff0c;它经常与 ThreadX 一起使用来提供网络功能。在 ThreadX 和 NetX 中设置和获取 IP 地址通常涉及几个步骤。 设置 IP 地址 初始…...

中国工程建设造价信息网站/北京seo实战培训班

有时我们在安装系统后&#xff0c;发现没有安装当前系统的内核源码在/usr/src/kernels目录下。其实很简单&#xff0c;是少安装了一个rpm包&#xff08;kernel-devel&#xff09;&#xff1b; 安装上就可以了 有些软件安装没有问题&#xff0c;运行时就报错。&#xff08;我今天…...

如何的找网站建设公司/网店推广的方式

BIO 与 NIO 对比 下表总结了 Java BIO(Block IO)和 NIO(Non-Block IO)之间的主要差别异。 面向流与面向缓冲 Java NIO 和 BIO 之间第一个最大的区别是&#xff0c;BIO 是面向流的&#xff0c;NIO 是面向缓冲区的。 Java BIO 面向流意味着每次从流中读一个或多个字节&#xff…...

用html做女装网站/百度客服人工电话95188

Java 7之集合类型 - 二叉排序树、平衡树、红黑树 http://blog.csdn.net/mazhimazh/article/details/19961017Java并发教程 http://www.iteye.com/magazines/131...

报名网站制作/南平seo

程序员掌握 HTTP 有多重要&#xff1f;1&#xff1a;了解Http协议&#xff0c;可以了解Web应用程序前后端的交互2&#xff1a;可以模仿Http的post和get的请求方式&#xff0c;写一个类似HttpClient的工具&#xff0c;然后爬虫。3&#xff1a;可以自己写一个浏览器&#xff0c;对…...

好的wordpress主题/网店代运营公司靠谱吗

当我们使用类型number的input输入框的时候&#xff0c;我们可能需要限制输入的位数&#xff0c;这个时候通常会想到maxlength&#xff0c;但是maxlength是在number类型的时候是不支持的&#xff0c;下面是一些解决这种问题的方法。1&#xff09;max和min max和min是number输入框…...

永年做网站多少钱/百度搜索引擎

题目 长度为n(n<1e5)的仅由abc三种字母组成的串&#xff0c; q(q<1e5)次操作&#xff0c;每次给出两个参数pos x&#xff08;x属于a、b、c三种字母中的一种&#xff09;&#xff0c; 表示把pos位置的字母改成x&#xff0c; 每次改完之后&#xff0c;都需要输出把整个…...