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

【RabbitMQ消息队列】详解(一)

初识RabbitMQ

RabbitMQ 是一个开源的消息代理软件,也被称为消息队列中间件,它遵循 AMQP(高级消息队列协议),并且支持多种其他消息协议。
在这里插入图片描述

核心概念

  • 生产者(Producer):创建消息并将其发送到 RabbitMQ 的应用程序。生产者并不关心消息会被发送到哪个队列,而是将消息发送到交换器(Exchange)。
  • 消费者(Consumer):从队列中获取消息并进行处理的应用程序。消费者监听特定的队列,一旦队列中有新消息,就会将其取出并处理。
  • 队列(Queue):是 RabbitMQ 内部用于存储消息的缓冲区。它是一个先进先出(FIFO)的数据结构,多个生产者可以向同一个队列发送消息,多个消费者也可以从同一个队列接收消息。
  • 交换器(Exchange):接收生产者发送的消息,并根据路由规则将消息路由到一个或多个队列。常见的交换器类型有直连交换器(Direct Exchange)、主题交换器(Topic Exchange)、扇形交换器(Fanout Exchange)和头交换器(Headers Exchange)。
  • 绑定(Binding):是交换器和队列之间的关联关系。通过绑定,交换器可以知道将消息路由到哪些队列。

工作模式

  • 简单模式(Simple Mode):一个生产者将消息发送到一个队列,一个消费者从该队列接收消息。
  • 工作队列模式(Work Queues):多个消费者从同一个队列中竞争获取消息,以实现任务的分发和负载均衡。
  • 发布 / 订阅模式(Publish/Subscribe):生产者将消息发送到扇形交换器,交换器将消息广播到所有绑定的队列,每个绑定的队列都有一个消费者接收消息。
  • 路由模式(Routing):生产者将消息发送到直连交换器,交换器根据消息的路由键将消息路由到绑定键与之匹配的队列。
  • 主题模式(Topics):生产者将消息发送到主题交换器,交换器根据消息的路由键和绑定键的匹配规则将消息路由到相应的队列。

优势

  • 解耦:生产者和消费者之间通过消息队列进行通信,它们不需要直接相互了解,从而降低了系统之间的耦合度。
  • 异步通信:生产者发送消息后可以继续执行其他任务,不需要等待消费者处理完消息,提高了系统的响应速度和吞吐量。
  • 流量削峰:在高并发场景下,消息队列可以作为缓冲区,将大量的请求暂存起来,避免后端服务因瞬间高流量而崩溃。
  • 可扩展性:可以通过增加消费者的数量来提高系统的处理能力,以应对不断增长的业务需求。

应用场景

  • 异步处理:例如用户注册时,将发送邮件、短信等通知的任务放入消息队列,由专门的消费者异步处理,提高注册接口的响应速度。
  • 系统解耦:在微服务架构中,各个服务之间通过消息队列进行通信,降低服务之间的耦合度,提高系统的可维护性和可扩展性。
  • 流量削峰:在电商系统的秒杀活动中,将用户的请求放入消息队列,后端服务按照一定的速率从队列中取出请求进行处理,避免系统因瞬间高流量而崩溃。
  • 日志收集:将各个服务产生的日志信息发送到消息队列,由专门的日志处理服务从队列中获取日志信息进行存储和分析。

与其他消息队列的比较

  • Kafka:Kafka 是一个高吞吐量的分布式消息系统,主要用于处理大规模的实时数据流。与 RabbitMQ 相比,Kafka 的吞吐量更高,更适合处理海量数据的实时传输和处理,但在消息的可靠性和灵活性方面相对较弱。
  • ActiveMQ:ActiveMQ 是一个老牌的消息队列中间件,支持多种消息协议,功能较为全面。与 RabbitMQ 相比,ActiveMQ 的性能相对较低,配置和管理也较为复杂。

RabbitMQ 是一个功能强大、性能稳定、易于使用的消息队列中间件,广泛应用于各种分布式系统和微服务架构中。

生产者

1. 导入 pika

import pika

pika 是 Python 里用于与 RabbitMQ 消息代理交互的库,借助它能够实现消息的发送与接收。

2. 建立与 RabbitMQ 服务器的连接

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))

pika.ConnectionParameters('localhost'):创建一个连接参数对象,这里指定 RabbitMQ 服务器的地址为 localhost,也就是本地机器。要是你的 RabbitMQ 服务器部署在其他机器上,就得把 localhost 替换成对应的 IP 地址或者域名。
pika.BlockingConnection():构建一个阻塞式的连接对象。所谓阻塞式连接,意味着在连接建立之后,程序会暂停等待,直到操作完成。

3. 创建通道

channel = connection.channel()

在 RabbitMQ 里,通道是进行大部分操作的基础。通道是轻量级的连接,可在一个连接上创建多个通道,以此来提升效率。借助通道,你能够声明队列、发送和接收消息等。

4. 声明队列

channel.queue_declare(queue='queue1')

channel.queue_declare():这是一个方法,其用途是声明一个队列。如果指定的队列不存在,就会创建该队列;若队列已经存在,则不会有任何影响。
queue='queue1':指定队列的名称为 queue1

5. 发布消息到队列

channel.basic_publish(exchange='', routing_key='queue1', body='hello world!')

channel.basic_publish():这是一个用于发布消息的方法。
exchange='':指定交换器的名称。这里为空字符串,代表使用默认的交换器(也就是简单模式)。默认交换器会根据路由键把消息路由到对应的队列。
routing_key='queue1':指定路由键。由于使用的是默认交换器,所以消息会被路由到名称为 hello 的队列。
body='hello world!':指定要发送的消息内容,此处消息内容为 hello world!

import pika# 1.建立与 RabbitMQ 服务器的连接
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))# 2.创建通道
channel = connection.channel()# 3.声明队列
channel.queue_declare(queue='queue1')# 4.发布消息到队列
channel.basic_publish(exchange='', routing_key='queue1', body='hello world!')channel.close()connection.close()

消费者

1. 定义回调函数

def callback(ch, method, properties, body):print(" [x] Received %r" % body)

这是一个回调函数,当消费者从队列中接收到消息时,会调用这个函数。
函数的参数含义如下:
ch:通道对象,用于与 RabbitMQ 进行交互。
method:包含消息传递的元数据,如路由键、交换器等。
properties:消息的属性,如消息头、优先级等。
body:消息的实际内容,以字节形式表示

2.开始消费消息

channel.basic_consume(queue='queue1', auto_ack=True, on_message_callback=callback)

channel.basic_consume():该方法用于启动一个消费者,从指定队列中接收消息。
queue='queue1':指定要消费的队列名称为 queue1
auto_ack=True:表示自动确认消息。当消费者接收到消息后,会立即向 RabbitMQ 发送确认信号,告知 RabbitMQ 该消息已被处理,可以从队列中删除。
on_message_callback=callback:指定当接收到消息时要调用的回调函数。

3. 启动消息消费循环

channel.start_consuming()

channel.start_consuming():启动一个无限循环,持续从队列中接收消息,并调用回调函数处理接收到的消息。直到程序被手动终止(如按下 CTRL+C)。

import pika# 1.建立与 RabbitMQ 服务器的连接
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))# 2.创建通道
channel = connection.channel()# 3.声明队列
channel.queue_declare(queue='queue1')# 4.定义回调函数
def callback(ch, method, properties, body):print(" [x] Received %r" % body)# 5.开始消费消息
channel.basic_consume(queue='queue1', auto_ack=True, on_message_callback=callback)# 6.启动消息消费循环
channel.start_consuming()

相关文章:

【RabbitMQ消息队列】详解(一)

初识RabbitMQ RabbitMQ 是一个开源的消息代理软件,也被称为消息队列中间件,它遵循 AMQP(高级消息队列协议),并且支持多种其他消息协议。 核心概念 生产者(Producer):创建消息并将其…...

FFmpeg之三 录制音频并保存, API编解码从理论到实战

在学习FFmpeg的时候,想拿demo来练习,官方虽有示例,但更像是工具演示,新手不好掌握,在网上找不到有文章,能给出完整的示例和关键点的分析说明,一步一个错误,慢慢啃过来的,…...

Kaamel白皮书:2025版COPPA落地实操指南

COPPA简介 《儿童在线隐私保护法案》(COPPA)于1998年在美国颁布,其最初的动因源于人们日益增长的对互联网上收集儿童个人信息的担忧。为了响应这一问题,联邦贸易委员会(FTC)被授权制定并执行相关法规。COP…...

Jenkins Pipeline 构建 CI/CD 流程

文章目录 jenkins 安装jenkins 配置jenkins 快速上手在 jenkins 中创建一个新的 Pipeline 作业配置Pipeline运行 Pipeline 作业 Pipeline概述Declarative PipelineScripted Pipeline jenkins 安装 安装环境: Linux CentOS 10:Linux CentOS9安装配置Jav…...

蓝桥杯 8. 移动距离

移动距离 原题目链接 题目描述 X 星球居民小区的楼房全是一样的,并且按矩阵样式排列。楼房的编号为 1, 2, 3, ⋯⋯。 当排满一行时,从下一行相邻的楼往反方向排号。 例如,当小区排号宽度为 6 时,排列如下: 1 2 …...

AJAX 介绍

一、什么是AJAX ? AJAX 是 异步的 JavaScript 和 XML(Asynchronous JavaScript And XML) 的缩写,是一种实现浏览器与服务器进行数据通信的技术。其核心是通过 XMLHttpRequest 对象在不重新刷新页面的前提下,与服务器交换数据并更…...

硬盘损坏数据恢复后对python程序的影响

最近硬盘突然间坏掉了&#xff0c;让数据商恢复了2个月今天终于拿到了恢复后的数据。 但是一测试问题就来了&#xff1a; PS E:\geosystem> python manage.py runserver 0.0.0.0:5000 Unhandled exception in thread started by <function check_errors.<locals>.…...

promis(resolve,reject)入门级别

JavaScript Promise 的定义 Promise 是一种用于处理异步操作的对象&#xff0c;表示一个可能已经完成或者尚未完成的操作的结果。它的核心作用在于简化复杂的回调嵌套问题&#xff08;即所谓的“回调地狱”&#xff09;&#xff0c;使异步代码更加清晰易读。 Promise 的状态 …...

w~嵌入式C语言~合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/13870384 一、开源MCU简易数字示波器项目 这是一款采用STC8A8K MCU制造的简单示波器&#xff0c;只有零星组件&#xff0c;易于成型。这些功能可以涵盖简单的测量&#xff1a; 该作品主要的规格如下&#xff1a; 单片机…...

学习海康VisionMaster之路径提取

一&#xff1a;进一步学习了 今天学习下VisionMaster中的路径提取&#xff1a;可在绘制的路径上等间隔取点或查找边缘点 二&#xff1a;开始学习 1&#xff1a;什么是路径提取&#xff1f; 相当于事先指定一段路径&#xff0c;然后在对应的路径上查找边缘&#xff0c;这个也是…...

第十二章-PHP文件上传

第十二章-PHP文件上传 一&#xff0c;文件上传原理 一、HTTP协议与文件上传 1. 请求体结构 当表单设置enctype"multipart/form-data"时&#xff0c;浏览器会将表单数据编码为多部分&#xff08;multipart&#xff09;格式。 Boundary分隔符&#xff1a;随机生成的…...

第35课 常用快捷操作——用“鼠标左键”拖动图元

概述 拖动某个图元&#xff0c;是设计过程中常需要用到的操作&#xff0c;我们可以在原理图中拖动某个元器件符号&#xff0c;也可以在PCB图中拖动某个焊盘。 和常用的软件类似&#xff0c;用按住鼠标左键的方式来完成拖动操作。 用鼠标左键拖动图元 在想要拖动的图元上&…...

qt.qpa.plugin: Could not find the Qt platform plugin “cocoa“ in “ “

开发的pyqt项目在Windows运行时没啥问题&#xff0c;移植到Mac中时&#xff0c;发现一直报错qt.qpa.plugin: Could not find the Qt platform plugin “cocoa” in " "&#xff0c;一开始认为是pyqt版本问题&#xff0c;换了版本依旧不行。后续按照网上pip install o…...

二、Web服务常用的I/O操作

一、单个或者批量上传文件 前端&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文件…...

「Mac畅玩AIGC与多模态04」开发篇01 - 创建第一个 LLM 对话应用

一、概述 本篇介绍如何在 macOS 环境下&#xff0c;基于已部署完成的 Dify 平台和本地 LLM 模型&#xff08;如 DeepSeek&#xff09;&#xff0c;创建并测试第一个基础对话应用&#xff0c;实现快速验证推理服务与平台交互功能。 二、应用创建流程 1. 通过首页创建应用 打…...

深度探究获取淘宝商品数据的途径|API接口|批量自动化采集商品数据

在电商行业竞争日益激烈的今天&#xff0c;淘宝商品数据如同蕴藏巨大价值的宝藏&#xff0c;无论是商家进行竞品分析、优化商品策略&#xff0c;还是数据分析师挖掘市场趋势&#xff0c;都离不开对这些数据的获取与分析。本文将深入探讨获取淘宝商品数据的多种途径&#xff0c;…...

马哥教育Linux云计算运维课程

课程大小&#xff1a;19.1G 课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/90640128 更多资源下载&#xff1a;关注我 你是否找了很多资料看了很多视频聊了很多群友&#xff0c;却发现自己技术仍然原地踏步&#xff1f;本教程联合BAT一线导师倾囊相授…...

FPGA与边缘AI:计算革命的前沿力量

在数字化转型浪潮中&#xff0c;边缘计算和人工智能正引领着技术革命。而FPGA&#xff08;现场可编程门阵列&#xff09;作为一种独特的硬件架构&#xff0c;正逐渐成为边缘AI领域的关键推动力。本文将探讨FPGA与边缘AI的结合如何重塑我们的数字世界&#xff0c;以及这一技术融…...

Kafka 架构设计和组件介绍

什么是Apache Kafka&#xff1f; Apache Kafka 是一个强大的开源分布式事件流平台。它最初由 LinkedIn 开发&#xff0c;最初是一个消息队列&#xff0c;后来发展成为处理各种场景数据流的工具。 Kafka 的分布式系统架构支持水平扩展&#xff0c;使消费者能够按照自己的节奏检…...

虚函数表的设计和多态的实现

虚函数表 1.包含虚函数的类会有对应的虚函数表&#xff0c;这个表在编译时就初始化好了 2.本质是一个函数指针数组&#xff0c;里面是虚函数的指针 3.该类实例化的对象共用一张虚函数表 4.子类的虚函数表会继承父类的虚函数&#xff0c;如果继承多个父类那就把父类的虚函数…...

【Node.js 】在Windows 下搭建适配 DPlayer 的轻量(简陋)级弹幕后端服务

一、引言 DPlayer官网&#xff1a;DPlayer 官方弹幕后端服务&#xff1a;DPlayer-node MoePlayer/DPlayer-node&#xff1a;使用 Docker for DPlayer Node.js 后端&#xff08;https://github.com/DIYgod/DPlayer&#xff09; 本来想直接使用官网提供的DPlayer-node直接搭建…...

OpenSSH配置连接远程服务器MS ODBC驱动与Navicat数据库管理

OpenSSH配置连接远程服务器MS ODBC驱动与Navicat数据库管理 目录 OpenSSH配置连接远程服务器MS ODBC驱动与Navicat数据库管理 一、MS ODBC驱动 1.1、安装到Windows后的表现形式 1.2、版本的互斥性 1.3、安装程序 1.4、配置后才可用 二、Navicat数据库管理工具 2.1、安…...

织梦dedecms调用会员详细字段信息

织梦如何调用会员详细信息&#xff1a; 在include/extend.func.php function GetMemberInfos($fields,$mid){ global $dsql; if($mid < 0){ $revalue "Error"; } else{ $row$dsql->GetOne("sele ct * fr…...

MySQL 8.0 忘记登录密码 mysqld --init-file重置

看到了很多跳过授权表的办法&#xff0c;这里通过mysqld --init-file办法。 适用情况&#xff1a; 服务器可以启动但无法登录/忘记登录密码。 一、首先停止 MySQL 服务&#xff1a; 按下 Win R 组合键&#xff0c;输入 services.msc 并点击“确定”&#xff0c;打开“服务”…...

Python 学习路线与笔记跳转(持续更新笔记链接)

这里写目录标题 Python 学习路线与笔记Python 简介学习路线第一阶段&#xff1a;Python 基础第二阶段&#xff1a;Python 进阶第三阶段&#xff1a;实用库与框架第四阶段&#xff1a;DevOps 与 Python第五阶段&#xff1a;最佳实践与高级技巧 学习资源官方资源在线学习平台书籍…...

操作系统:计算机世界的基石与演进

一、操作系统的本质与核心功能 操作系统如同计算机系统的"总管家"&#xff0c;在硬件与应用之间架起关键桥梁。从不同视角观察&#xff0c;其核心功能呈现多维价值&#xff1a; 硬件视角的双重使命&#xff1a; 硬件管理者&#xff1a;通过内存管理、进程调度和设…...

Codeium 免费的AI编程助手

Codeium 由 Exafunction 团队&#xff08;主要也是美国华人&#xff09;开发的一款免费AI编程助手&#xff0c;是一个建立在顶尖AI技术上的代码加速工具&#xff0c;其背后的老板非常厉害&#xff0c;据说投资过马斯克的SpaceX。Codeium 本身具有颇多的亮点&#xff0c;支持70种…...

在MySQL Shell里 重启MySQL 8.4实例

前一段时间看到MySQL官方视频的Oracle工程师在mysql shell里面重启mysql实例&#xff0c;感觉这个操作很方便&#xff0c;所以来试试&#xff0c;下面为该工程师的操作截图 1.MySQL Shell 通过root用户连上mysql&#xff0c;shutdown mysql实例 [rootmysql8_3 bin]# mysqlshMy…...

FANUC机器人GI与GO位置数据传输设置

FANUC机器人GI与GO位置数据传输设置&#xff08;整数小数分开发&#xff09; 一、概述 在 Fanuc 机器人应用中&#xff0c;如果 IO 点位足够&#xff0c;可以利用机器人 IO 传输位置数据及偏移位置数据等。 二、操作步骤 1、确认通讯软件安装 首先确认机器人控制柜已经安装…...

LeetCode 24 两两交换链表中的节点

​给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[2,1…...