为什么选择 RabbitMQ?*

RabbitMQ 是一款可靠且成熟的消息代理和流处理中间件,可轻松部署在云端、本地数据中心或您的开发机上,目前已被全球数百万用户使用。
优势在哪里
互操作性
RabbitMQ 支持多种开放标准协议,包括 AMQP 1.0 和 MQTT 5.0,并提供多种编程语言的客户端库,您只需选择适合自己语言的版本即可,无需担心厂商锁定!

灵活性
RabbitMQ 提供多种功能组合,可自定义消息从生产者到单个或多个消费者的传递方式,如路由、过滤、流处理、联邦传输等,应有尽有。

可靠性
通过消息确认机制和集群消息复制,RabbitMQ 能确保您的消息安全无误。
在这里插入图片描述
总结
RabbitMQ 是轻量级、易用、功能全面的消息中间件,适合需要灵活路由、多协议支持、高可靠性的场景。如果您的业务需要简单的任务队列或复杂的事件路由,RabbitMQ 是理想选择;若是日志处理或大数据流,可考虑 Kafka。

常见使用场景示例

以下是来自社区或客户的一些典型用例,帮助您更好地理解 RabbitMQ 的功能及其实际应用价值。

1. 解耦互联服务(通过RabbitMQ实现通知系统)

在这里插入图片描述

场景描述
你有一个后端服务,需要向终端用户发送通知。通知有两种渠道:

  • 电子邮件(Email)
  • 移动应用推送(Push Notification)

传统做法可能是后端直接调用邮件服务和推送服务,但这会导致:

  • 系统紧耦合:如果邮件服务宕机,可能影响整个通知流程。
  • 无法应对突发流量:如果突然有大量通知请求,后端可能被压垮。
  • 维护困难:升级或维护某个通知服务时,需要停用整个系统。

RabbitMQ 的解决方案
使用 RabbitMQ 解耦后端服务和通知渠道,流程如下:

  • 后端服务(Producer) 生成通知后,不直接调用邮件或推送服务,而是将消息发布到两个独立的队列:

    • email_queue(邮件队列)
    • push_queue(推送队列)
  • 邮件服务和推送服务(Consumer) 各自订阅对应的队列,并异步处理消息。

    • [Backend Service]

      ├── Publishes to → [email_queue] → Consumed by [Email Service]

      └── Publishes to → [push_queue] → Consumed by [Push Notification Service]

2. 基于 RabbitMQ 的远程过程调用(RPC)实现票务系统

在这里插入图片描述
场景描述
你经营一个音乐厅,门票通过多个渠道销售:

  • 线上网站
  • 线下自助终端(Kiosk)

所有渠道的订单都需要经过复杂的票务库存处理(如检查余票、分配座位等),并且要求极低延迟的响应(用户下单后需立即知道是否成功)。

传统同步调用的问题

如果直接使用同步调用(如 HTTP API):

  • 高延迟:库存服务处理时间不稳定,可能阻塞前端响应。
  • 系统耦合:库存服务宕机会导致所有销售渠道不可用。
  • 并发冲突:多个渠道同时抢票时,可能超卖(需依赖数据库事务,性能低下)。

RabbitMQ 的 RPC 解决方案
通过 RabbitMQ 实现异步 RPC 调用,流程如下:

  • 1、发布订单请求

    • 网站或终端(RPC Client)生成订单,附带唯一 correlation_id,发送到请求队列

    • [Client] → Publish to → [rpc_request_queue]
      (Message: {order_details, correlation_id})

  • 2、处理订单

    • 库存服务(RPC Server)从 rpc_request_queue 消费消息,处理业务逻辑(如检查余票)。
  • 3、返回响应

    • 库存服务将处理结果(成功/失败)发送到响应队列,并携带相同的 correlation_id
    • [Server] → Publish to → [rpc_reply_queue]
      (Message: {result, correlation_id})

  • 4、客户端接收响应

    • 客户端监听 rpc_reply_queue,通过 correlation_id 匹配自己的请求,获取结果。
    • ±---------------+ ±------------------+
      | RPC Client | | RPC Server |
      | (Website/Kiosk)| | (Inventory Service)|
      ±------±-------+ ±--------±--------+
      | |
      | 1. Order + correlation_id|
      ±------------------------------------->+
      | |
      | 3. Result + correlation_id|
      <--------------------------------------+
      | |
      ±------±-------+ ±--------±--------+
      | rpc_request_queue | rpc_reply_queue |
      ±---------------+ ±------------------+

关键设计点

  • 关联 ID(correlation_id)
    确保响应与请求正确匹配,避免多客户端场景下的混乱。

  • 队列选择

    • 经典队列(Classic Queue):低延迟,但消息可能丢失(适合可重试场景)。
    • 仲裁队列(Quorum Queue):高可靠性,通过多数节点确认保证消息安全(适合金融级场景)。
  • 序列化处理
    所有订单按先进先出(FIFO)处理,避免超卖,无需数据库事务。

实际应用扩展

  • 机票预订系统:多平台同时抢票时,通过 RabbitMQ RPC 保证库存一致性。
  • 秒杀活动:突发流量下,用队列缓冲请求,按序处理。

3、RabbitMQ流式处理(Streaming)详解

在这里插入图片描述

场景描述
你运营一个视频平台(如B站、YouTube)。当用户上传视频后,系统需要完成多个后续任务:

1. 实时任务:立即通知订阅该UP主的粉丝。

2、延迟任务

  • 视频内容分析(如AI鉴黄、标签提取)

  • 转码生成多种清晰度的副本(如1080p、720p)

  • 数据统计(如播放量预测)

传统架构的问题
若用普通消息队列(如RabbitMQ经典队列):

  • 消息重复:每个任务需要独立队列,同一视频上传事件会被复制多份(通知队列、转码队列等),浪费资源。

  • 无法回溯:消息被消费后即删除,若分析服务崩溃,可能丢失数据。

RabbitMQ Streams的解决方案
1. 核心机制

  • 持久化流(Stream)
    上传服务将“新视频”事件按顺序追加到唯一流中(类似数据库的WAL日志)。

[视频上传事件流]
──▶ [事件1: 视频A上传] → [事件2: 视频B上传] → [事件3: 视频C上传] → …

  • 多消费者独立订阅:
    每个后端服务(通知、转码、分析)可独立读取流中的事件,互不干扰。

2. 工作流程

  • 2.1视频上传完成 → 事件写入流(如video_upload_stream)。

  • 2.2通知服务
    - 实时读取最新事件,立即推送粉丝。
    - 读取后不删除事件,其他服务仍可访问。

  • 2.3转码服务
    按自身速度消费事件,生成多分辨率视频。

  • 2.4分析服务
    每天凌晨批量读取全天事件,运行离线分析。

3. 关键优势

优势说明
高效无重复所有任务共享同一流,无需为每个任务复制消息。
消费者独立性每个服务可自由控制读取位置(如通知读最新,分析读历史)。
消息可回溯即使服务崩溃,重启后可从断点继续消费,数据不丢失。
高吞吐流式存储针对顺序读写优化,性能高于传统队列。

技术对比:Stream vs 经典队列

特性RabbitMQ经典队列RabbitMQ Streams
消息生命周期消费后默认删除永久存储(除非手动删除)
多消费者同一队列消息只能被一个消费者多消费者独立读取同一流
回溯能力不支持支持(通过偏移量定位)
适用场景任务分发、RPC事件溯源、日志处理

实际应用示例

  • 视频平台(如案例所述)

  • 电商订单流水

    • 订单创建事件写入流,实时通知用户、异步更新库存、离线生成报表。
  • 物联网传感器数据

    • 设备数据实时流,同时供监控告警和离线分析使用。

为何选择RabbitMQ Streams?

  • 解耦:上传服务无需知道下游有哪些任务。

  • 弹性:新增任务(如后续增加“视频指纹提取”)只需新增一个消费者,无需改原有架构。

  • 可靠性:消息持久化,即使服务器重启也不丢失。

一句话总结: RabbitMQ Streams通过持久化、可共享的消息流,实现了高效、灵活的事件驱动架构,特别适合混合实时与离线处理的场景。

4、基于 RabbitMQ 的星际无人机(IoT)通信系统

在这里插入图片描述

场景描述
你经营一家提供银河系包裹配送的公司,拥有大量太空无人机(Space Drones)。这些无人机需要定期向位于系外行星 Kepler-438 b 的中央服务器上报状态(如位置、电量、包裹状态)。但星际网络连接极不稳定,经常因行星轨道错位或宇宙干扰中断。
传统方案的挑战
若直接让无人机通过 HTTP 或 TCP 连接中央服务器:

  • 网络不可靠:信号延迟高(可能几小时到几天),连接频繁中断。
  • 数据丢失风险:断网时无人机的状态报告无法送达。
  • 海量连接管理:数百万无人机同时在线,服务器难以承受。

RabbitMQ 的解决方案

  • 1. 分布式消息缓冲架构

    • 每个无人机本地部署 RabbitMQ 节点

      • 无人机将状态报告先写入本地 RabbitMQ(边缘存储),避免依赖实时网络。
      • 数据持久化,即使无人机重启也不会丢失。
    • 上游中心化 RabbitMQ

      • 位于 Kepler-438 b 的服务器运行主 RabbitMQ,接收所有无人机的最终数据。
  • 2. 网络恢复后同步数据

    • 行星对齐时(网络恢复)
      本地 RabbitMQ 通过 Shovel/Federation 插件,将积压的报告批量同步到上游服务器。

      • Shovel:单向跨节点消息转移,适合临时连接。

      • Federation:动态拓扑的消息同步,适合复杂网络。

  • 3. 协议选择

    • MQTT 协议

      • 无人机与本地 RabbitMQ 之间使用 MQTT(轻量级 IoT 协议),支持:

        • 低功耗(适合太空设备)。
        • 高并发连接(百万级无人机)。
      • RabbitMQ 通过 MQTT 插件 兼容此协议

系统架构图

[无人机 Drone 1] → [本地 RabbitMQ] -
[无人机 Drone 2] → [本地 RabbitMQ] → 行星对齐时同步 → [上游 RabbitMQ (Kepler-438 b)] → [中央服务器]
… /
[无人机 Drone N] → [本地 RabbitMQ]

核心优势(Benefits)

优势说明
离线优先无人机在网络中断时仍能持续记录数据,不会丢失报告。
弹性网络适应仅在网络可用时同步,容忍高延迟和间歇性连接。
高并发支持MQTT 协议优化海量设备连接,RabbitMQ 集群横向扩展。
解耦与可靠性中央服务器无需知道无人机是否在线,消息最终一致。

关键技术组件

1、RabbitMQ Shovel

  • 将本地队列的消息自动转发到上游交换器。
  • 配置示例:
{rabbitmq_shovel, [{shovels, [{drone_to_central, [{sources, [{brokers, ["localhost"]}]},{destinations, [{brokers, ["kepler-438b.server"]}]},{queue, <<"drone_reports">>}]}]}
]}

2、RabbitMQ Federation

  • 跨星球的 RabbitMQ 节点形成联邦,按需同步消息。

  • 适合长期网络不稳定的场景。

3、MQTT 插件

  • 启用 MQTT 协议支持:
rabbitmq-plugins enable rabbitmq_mqtt

对比其他消息中间件

特性RabbitMQ (+MQTT)KafkaAWS IoT Core
离线支持✔️(边缘节点缓冲)❌(需持续连接)✔️(但需额外配置)
协议兼容性MQTT/AMQP/STOMP自定义协议仅MQTT/HTTP
部署复杂度中(需配置Shovel)低(全托管)
适用场景边缘计算+最终一致性高吞吐日志流纯云端IoT

实际应用扩展

  • 地球上的类似场景

    • 远洋船舶、油田设备在卫星网络间歇可用时的数据上报。

    • 军事无人机在敌占区的隐蔽通信。

其他行业

  • 智能电网(电表数据批量同步)。
  • 自动驾驶车队(离线时本地存储,网络恢复后上传)。

总结
通过 RabbitMQ 的分布式消息队列 + MQTT 协议,该系统实现了:

  • 抗网络中断:边缘节点缓冲数据,行星对齐时同步。
  • 海量设备管理:MQTT 支持百万级无人机连接。
  • 灵活性:Shovel/Federation 适应不同网络拓扑。
    这种架构是 深空通信、边缘计算、IoT 设备管理 的理想选择! 🚀

RabbitMQ工作模型

在这里插入图片描述
rabbitmq和mysql作类比,理解rabbitmq概念:

  • broker 相当于mysql服务器
  • virtual host相当于数据库(一个mysql服务器可以有多个数据库,一台broker可以有多个虚拟主机)
  • queue相当于表(一个数据库有多张表,一个虚拟主机有多个队列)
  • 消息相当于记录(一张表中有多条记录,一个队列中有多条消息)

消息队列有三个核心要素: 消息生产者消息队列消息消费者
生产者(Producer):发送消息的应用;(java程序,也可能是别的语言写的程序)
消费者(Consumer):接收消息的应用;(java程序,也可能是别的语言写的程序)
代理(Broker):就是消息服务器,RabbitMQ Server就是Message Broker
连接(Connection):连接RabbitMQ服务器的TCP长连接;
信道(Channel):连接中的一个虚拟通道,消息队列发送或者接收消息时,都是通过信道进行的;
虚拟主机(Virtual host):一个虚拟分组,在代码中就是一个字符串,当多个不同的用户使用同一个RabbitMQ服务时,可以划分出多个Virtual host,每个用户在自己的Virtual host创建exchange/queue等;(分类比较清晰、相互隔离)
交换机(Exchange):交换机负责从生产者接收消息,并根据交换机类型分发到对应的消息队列中,起到一个路由的作用;
路由键(Routing Key):交换机根据路由键来决定消息分发到哪个队列,路由键是消息的目的地址;
绑定(Binding):绑定是队列和交换机的一个关联连接(关联关系);
队列(Queue):存储消息的缓存;
消息(Message):由生产者通过RabbitMQ发送给消费者的信息;(消息可以为任何数据,字符串,user对象,json串,图片,mp3,视频等等)

Exchange(X) 可翻译成交换机/交换器/路由器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913062.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913062.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913062.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【精华】QPS限流等场景,Redis其他数据结构优劣势对比

下面是一个详细的 Redis 数据结构对比表&#xff0c;比较它们在实现 QPS 限流 / 滑动窗口统计 / 查定比监控等场景中的适用性&#xff1a; ✅ Redis 数据结构对比表&#xff08;用于接口限流 / QPS 监控&#xff09; 维度String INCR 固定窗口List 滑动窗口Hash 计数器ZSet 滑…

顶层设计:支持单元化、灰度化的应用架构

一、顶层目标 业务连续性&#xff1a;任何单元故障不影响整体弹性伸缩&#xff1a;根据业务流量横向扩展灵活灰度&#xff1a;任何发布都可逐步平滑上线成本可控&#xff1a;单元化带来的资源冗余最小 二、核心理念 设计目标核心理念单元化垂直拆分&#xff0c;分而治之&…

MacOS Safari 如何打开F12 开发者工具 Developer Tools

背景 If you’re a web develper, the Safari Develop menu provides tools you can use to make sure your website works well with all standards-based web browsers. 解决 If you don’t see the Develop menu in menu bar, Choose Safari > settingsClick Advanced…

2025—暑期训练一

A 本题描述了一个最优路径规划问题的解法&#xff0c;核心思路是利用数轴上区间覆盖的特性&#xff0c;将问题简化为两个端点的访问问题。以下是关键点的详细解析&#xff1a; 核心观察 区间覆盖特性 给定的位置数组 x1, x2, ..., xn 是严格递增的&#xff08;即 x1 < x2 …

ubuntu 18.04配置镜像源

配置镜像源的主要作用是优化软件下载速度、提升系统更新稳定性&#xff0c;并确保软件包获取的可靠性 我这里配置阿里云镜像源 镜像的具体内容参考此文: 文章链接 以防万一,先备份一下 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后开始修改 sudo nano /etc…

RecyclerView中跳转到最后一条item并确保它在可视区域内显示

在RecyclerView中跳转并显示最后一条Item 要在RecyclerView中跳转到最后一条item并确保它在可视区域内显示&#xff0c;可以使用以下几种方法&#xff1a; 1. 使用scrollToPosition()方法&#xff08;基本方法&#xff09; recyclerView.scrollToPosition(adapter.getItemCo…

ubuntu22 桌面版开启root登陆

一、先创建root sudo passwd root 二、注释代码 vim /etc/pam.d/gdm-password vim/etc/pam.d/gdm-autologin 都注释 auth required pam_succeed_if.so user ! root quiet_success 三、修改profile文件 vim /root/.profile 注释掉 mesg n 2&#xff1e; /dev/null || true 插入新…

docker学习二天之镜像操作与容器操作

镜像的一般运用过程 一、镜像&#xff08;Image&#xff09;操作 镜像是容器的基础模板&#xff0c;存储在本地或远程仓库中。 1. 镜像拉取 # 从指定镜像源拉取 docker pull docker.m.daocloud.io/library/nginx 2. 镜像查看 # 列出本地镜像 docker images # 或 docker image…

多个参数用websocket 向io 服务器发送变量,一次发一个,并接收响应

问题&#xff1a;多个参数用websocket 向io 服务器发送变量&#xff0c;一次发一个&#xff0c;并接收响应&#xff0c;如果是多个变量&#xff0c;但还是需要一个个发送&#xff0c;应该怎么实现&#xff0c;思路是什么样子的呢&#xff1f;用数组的话&#xff0c;应该怎么用&…

Flink-05学习 接上节,将FlinkJedisPoolConfig 从Kafka写入Redis

上节成功实现了FlinkKafkaConsumer消费Kafka数据&#xff0c;并将数据写入到控制台&#xff0c;接下来将继续将计算的结果输入到redis中。 pom.xml 引入redis到pom包 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mave…

git教程-pycharm使用tag打标签

一.生成tag标签 前言 当我们的代码完成了第一阶段的需求&#xff0c;版本稳定后&#xff0c;希望能出个稳定版本。于是在 commit 后需要打个 tag 标签&#xff0c;也就是我们平常说的版本号&#xff0c;如v1.0版本 本篇讲解如何使用 pycharm 打 tag 标签&#xff0c;并推送到…

PHP Error: 深入解析与处理技巧

PHP Error: 深入解析与处理技巧 引言 PHP作为一种广泛使用的服务器端脚本语言,在Web开发领域占据着重要地位。然而,任何编程语言都难以避免错误的发生。本文将深入探讨PHP错误处理的相关知识,包括错误类型、错误显示、错误日志以及错误处理技巧,帮助开发者更好地应对和解…

21、企业行政办公(OA)数字化转型:系统如何重塑企业高效运营新范式

企业行政办公是营造高效工作环境、提升员工幸福感和归属感的重要基石&#xff0c;更是传递组织温度与价值关怀的第一窗口。在数字化转型浪潮席卷各行各业的今天&#xff0c;企业行政办公领域正经历一场静默但深刻的变革。据统计&#xff0c;采用智能化OA系统的企业&#xff0c;…

基于开源AI智能名片链动2+1模式S2B2C商城小程序的抖音渠道力拓展与多渠道利润增长研究

摘要&#xff1a;在数字化商业竞争日益激烈的背景下&#xff0c;抖音平台凭借其庞大的流量基础和兴趣电商生态&#xff0c;成为品牌增长的关键阵地。渠道力作为品牌增长的核心驱动力&#xff0c;以抖音势能为内核&#xff0c;通过流量与销量的外溢效应&#xff0c;可显著提升品…

基于二维码的视频合集高效管理与分发技术

一、 视频资源聚合的技术挑战与解决方案 在企业培训、在线教育和产品展示等场景中&#xff0c;视频资源的结构化组织与高效分发始终是技术实现的核心挑战。传统方案往往面临三大痛点&#xff1a;资源碎片化导致的管理混乱、多视频序列播放的用户体验不佳、以及跨平台兼容性问题…

GPT-2论文阅读:Language Models are Unsupervised Multitask Learners

本文解析 OpenAI 2019 年发布的里程碑式论文&#xff0c;该论文首次提出了 GPT-2 模型&#xff0c;揭示了语言模型作为无监督多任务学习器的革命性潜力。文章的核心观点是&#xff1a;语言模型在无监督训练过程中&#xff0c;可以隐式地学习多种任务&#xff0c;无需特定任务微…

R 语言安装使用教程

一、R 语言简介 R 是一种用于统计分析、数据挖掘和可视化的编程语言和环境。它在学术界和数据分析领域中广泛使用&#xff0c;拥有丰富的统计函数库和绘图功能。 二、安装 R 语言 2.1 下载 R 安装包 前往 CRAN 官网下载适合你操作系统的安装程序&#xff1a; 官网地址&…

智能Agent场景实战指南 Day 1:智能Agent概述与架构设计

【智能Agent场景实战指南 Day 1】智能Agent概述与架构设计 引言 欢迎来到"智能Agent场景实战指南"系列的第一天&#xff01;今天我们将深入探讨智能Agent的基本概念和架构设计。在这个大模型时代&#xff0c;智能Agent已成为连接AI技术与实际业务场景的关键桥梁&am…

Plan-Grounded Large Language Models forDual Goal Conversational Settings

Plan-Grounded Large Language Models for Dual Goal Conversational Settings - ACL Anthologyhttps://aclanthology.org/2024.eacl-long.77/ 1. 概述 引导用户完成诸如烹饪或 DIY 之类的手动任务(Choi 等,2022),对于当前的大型语言模型(LLMs)来说是一个新颖且具有挑战…

python打卡day57@浙大疏锦行

知识点回顾 序列数据的处理&#xff1a; 处理非平稳性&#xff1a;n阶差分处理季节性&#xff1a;季节性差分自回归性无需处理 模型的选择 AR(p) 自回归模型&#xff1a;当前值受到过去p个值的影响MA(q) 移动平均模型&#xff1a;当前值收到短期冲击的影响&#xff0c;且冲击影…