消息队列RabbitMQ与AMQP协议详解

news2025/5/24 22:07:25

消息队列RabbitMQ与AMQP协议详解

什么是RabbitMQ

RabbitMQ是一个开源的消息队列中间件,基于AMQP(Advanced Message Queuing Protocol)协议实现。它作为一个消息代理(Message Broker),可以接收、存储和转发消息数据,用于解耦系统组件、实现异步通信、流量削峰等场景。

核心概念

消息队列基础

消息队列是一种异步通信模式,允许应用程序通过发送和接收消息进行通信:

  • Producer:消息生产者,负责发送消息到队列
  • Consumer:消息消费者,从队列接收消息并处理
  • Queue:消息队列,存储消息的缓冲区
  • Message:消息内容,包含有效载荷和属性

AMQP协议详解

什么是AMQP

AMQP(Advanced Message Queuing Protocol)是一个开放标准的应用层协议,专为面向消息的中间件设计。

AMQP核心特性

  1. 可互操作性:不同厂商实现的AMQP客户端和服务器可以互相通信
  2. 统一模型:定义了一套完整的消息传递模型
  3. 安全性:支持TLS加密和SASL认证
  4. 可靠性:通过事务或确认机制保证消息传递
  5. 二进制协议:更高效的数据传输

AMQP模型

AMQP 0-9-1模型(RabbitMQ采用的版本)包含以下核心组件:

  • Exchange:接收生产者消息并路由到队列
  • Queue:存储消息的队列
  • Binding:Exchange与Queue之间的链接规则
  • Virtual Host:虚拟隔离空间,包含独立的Exchange、Queue和Binding
  • Channel:连接内的虚拟连接,减少TCP连接开销

Exchange类型

RabbitMQ支持多种Exchange类型,决定消息如何路由:

  1. Direct Exchange:根据精确的routing key匹配
  2. Topic Exchange:根据模式匹配的routing key
  3. Fanout Exchange:广播到所有绑定的队列
  4. Headers Exchange:根据消息头属性匹配

RabbitMQ架构

核心组件

                    +----------------+
Producer ------→    |    Exchange    |    -----→ Queue -----→ Consumer
                    +----------------+
                           ↓
                    +----------------+
                    |     Binding    |
                    +----------------+

消息流程

  1. Producer发送消息到Exchange
  2. Exchange根据Binding规则将消息路由到相应的Queue
  3. Queue存储消息直到被Consumer消费
  4. Consumer接收并处理消息

消息确认机制

RabbitMQ提供了多种确认机制确保消息可靠传递:

  1. 生产者确认:Publisher Confirms和Publisher Returns
  2. 消费者确认:Consumer Acknowledgements
  3. 持久化:Exchange、Queue和Message的持久化

实战示例

连接RabbitMQ

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

简单消息发布

// 声明队列
channel.queueDeclare("simple-queue", true, false, false, null);

// 发布消息
String message = "Hello RabbitMQ!";
channel.basicPublish("", "simple-queue", 
                     MessageProperties.PERSISTENT_TEXT_PLAIN, 
                     message.getBytes());

消息消费

// 声明队列
channel.queueDeclare("simple-queue", true, false, false, null);

// 创建消费者
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
    String message = new String(delivery.getBody(), "UTF-8");
    System.out.println("Received: " + message);
    // 手动确认消息
    channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};

// 开始消费消息
channel.basicConsume("simple-queue", false, deliverCallback, consumerTag -> {});

使用Exchange和Binding

// 声明交换机
channel.exchangeDeclare("logs", BuiltinExchangeType.FANOUT);

// 创建临时队列
String queueName = channel.queueDeclare().getQueue();

// 绑定队列到交换机
channel.queueBind(queueName, "logs", "");

// 发布消息到交换机
String message = "Info: This is a log message";
channel.basicPublish("logs", "", null, message.getBytes());

RabbitMQ高级特性

消息优先级

Map<String, Object> args = new HashMap<>();
args.put("x-max-priority", 10);
channel.queueDeclare("priority-queue", true, false, false, args);

// 发送优先级消息
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
    .priority(8)
    .build();
channel.basicPublish("", "priority-queue", properties, message.getBytes());

消息TTL(Time-To-Live)

// 设置队列消息TTL
Map<String, Object> args = new HashMap<>();
args.put("x-message-ttl", 60000); // 60秒
channel.queueDeclare("ttl-queue", true, false, false, args);

// 设置单个消息TTL
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
    .expiration("10000") // 10秒
    .build();

死信队列

// 声明死信交换机
channel.exchangeDeclare("dlx", BuiltinExchangeType.DIRECT);

// 声明正常队列,并指定死信设置
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", "dlx");
args.put("x-dead-letter-routing-key", "dead");
channel.queueDeclare("normal-queue", true, false, false, args);

AMQP协议帧结构

AMQP是一个二进制协议,由帧(frames)组成:

  1. 帧头:包含帧类型、通道号和帧大小
  2. 帧体:包含实际的命令和数据
  3. 帧结尾:标记帧结束的字节

AMQP主要帧类型:

  • Method帧:包含AMQP命令
  • Header帧:包含消息属性和大小
  • Body帧:包含消息内容
  • Heartbeat帧:用于连接保活

总结

RabbitMQ作为实现AMQP协议的成熟消息中间件,提供了丰富的功能特性满足各种场景需求。AMQP协议的开放标准特性确保了系统的互操作性和可靠性。通过理解RabbitMQ和AMQP的核心概念,可以更好地设计和实现分布式系统中的消息通信模式。

在实际应用中,合理利用RabbitMQ的Exchange类型、队列特性和消息确认机制,可以构建高可用、高可靠的消息系统,实现系统解耦、负载均衡和流量削峰等目标。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32开发环境配置——VSCode+PlatformIO + CubeMX + FreeRTOS的集成环境配置

前言 为什么配置这样的一个环境呢&#xff1f;鄙人受够了Keil5那个简陋的工作环境了&#xff0c;实在是用不下去&#xff0c;调试上很容易跟CubeMX的代码产生不协调导致调试——发布代码不一致造成的一系列问题。CubeIDE虽说不错&#xff0c;但是它的代码辅助功能和构建系统实在…

Profibus转Profinet网关赋能鼓式硫化机:智能化生产升级的关键突破

在现代工业自动化领域&#xff0c;通讯协议转换器发挥着至关重要的角色。它们能够实现不同网络间的无缝对接和数据传输&#xff0c;确保了生产线上的设备可以顺畅地交流信息。今天&#xff0c;我们就来深入讨论开疆智能profibus转profinet网关KJ-PBM-PN以及其在鼓式硫化机中的应…

MongoDB 用户与权限管理完全指南

在当今数据驱动的时代&#xff0c;数据库安全已成为企业IT架构中最关键的环节之一。作为最受欢迎的NoSQL数据库之一&#xff0c;MongoDB提供了完善的用户认证和权限管理机制&#xff0c;但许多开发者和数据库管理员对这些功能的理解和应用仍停留在表面层次。本文将全面剖析Mong…

基于ITcpServer/IHttpServer框架的HTTP服务器

https://www.cnblogs.com/MuZhangyong/p/16839231.html 在基于ITcpServer/IHttpServer框架的HTTP服务器实现中,OnBody方法主要用于接收HTTP请求体数据,而触发HTTP响应通常是在OnMessageComplete方法中完成。以下是完整的响应触发机制说明: sequenceDiagramClient->>…

FPGA高效验证工具Solidify 8.0:全面重构图形用户界面

近日&#xff0c;FPGA高效验证工具Solidify发布了8.0版本。该版本对图形用户界面&#xff08;GUI&#xff09;进行了全面重构&#xff0c;历时两年&#xff0c;经过了大幅的架构改进&#xff0c;旨在为用户提供更安全、更稳定的使用环境。 Solidify的用户对隐私有严格要求&…

SIL2/PLd 认证 Inxpect毫米波安全雷达:3D 扫描 + 微小运动检测守护工业安全

Inxpect 成立于意大利&#xff0c;专注工业安全技术。自成立起&#xff0c;便致力于借助先进雷达技术提升工业自动化安全标准&#xff0c;解决传统安全设备在复杂环境中的局限&#xff0c;推出获 SIL2/PLd 和 UL 认证的安全雷达产品。 Inxpect 的雷达传感器技术优势明显。相较于…

2025电工杯数学建模A题思路数模AI提示词工程

我发布的智能体链接&#xff1a;数模AI扣子是新一代 AI 大模型智能体开发平台。整合了插件、长短期记忆、工作流、卡片等丰富能力&#xff0c;扣子能帮你低门槛、快速搭建个性化或具备商业价值的智能体&#xff0c;并发布到豆包、飞书等各个平台。https://www.coze.cn/search/n…

LLM | 论文精读 | NAACL 2025 | Clarify When Necessary:教语言模型何时该“问一句”再答!

&#x1f50d; 解读 NAACL 2025 重磅论文《Clarify When Necessary》&#xff1a;教语言模型何时该“问一句”再答&#xff01; &#x1f9e9; 一、现实问题&#xff1a;大模型“看不懂装懂”有多危险&#xff1f; 我们每天用的 ChatGPT、Claude 等大型语言模型&#xff08;LL…

嵌入式鸿蒙openharmony应用开发环境搭建与工程创建实现

各位小伙伴大家好,本周开始分享鸿蒙开发相关的内容,从基础的配置方法到各种功能的实现,探索国产操作系统的奥秘。 第一:观察结果 第二:开源语言 ArkTS是鸿蒙应用开发中使用的TypeScript超集,提供了一套丰富的API来构建应用界面和逻辑。 第三:环境搭建 步骤 1 通过如…

MDK的编译过程及文件类型全解

本章参考资料&#xff1a;MDK的帮助手册《ARM Development Tools》&#xff0c;点击MDK界面的“help->uVision Help”菜单可打开该文件。 关于ELF文件格式&#xff0c;参考配套资料里的《ELF文件格式》文件。 在本章中讲解了非常多的文件类型&#xff0c;学习时请跟着教程的…

Linux Shell编程(八)

目录 Case语句 1--case格式 2--case使用案例&#xff1a;输入不容的数字&#xff0c;给出不同的结果 跳出循环 1--break 案例&#xff1a;执行十次时&#xff0c;跳出当前循环 完整流程 2--continue 案例&#xff1a;跳过2&#xff0c;4 输出 完整流程 Case语句 1--case格式 c…

AI筑基,新质跃升|英码科技亮相华为广东新质生产力创新峰会,发布大模型一体机新品,助力产业智能化转型

5月15日&#xff0c;以“AI筑基&#xff0c;新质跃升”为主题的华为中国行2025广东新质生产力创新峰会在惠州圆满召开。本次峰会聚焦人工智能、算力基础设施等新ICT技术如何驱动“新质生产力”&#xff0c;共探广东高质量发展新路径。英码科技受邀出席本次峰会&#xff0c;并携…

手机打电话时由对方DTMF响应切换多级IVR语音菜单(话术脚本与实战)

手机打电话时由对方DTMF响应切换多级IVR语音菜单 &#xff08;话术脚本与实战&#xff09; --本地AI电话机器人 上一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音应答&#xff08;二&#xff09; 下一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音…

面试题——JDBC|Maven|Spring的IOC思想|DI思想|SpringMVC

目录 一、JDBC 1、jdbc连接数据库的基本步骤&#xff08;掌握**&#xff09; 2、Statement和PreparedStatement的区别 &#xff08;掌握***&#xff09; 二、Maven 1、maven的作用 2、maven 如何排除依赖 3、maven scope作用域有哪些&#xff1f; 三、Spring的IOC思想 …

DETR3D- 3D Object Detection from Multi-view Images via 3D-to-2D Queries

MIT CORL 2021 纯视觉BEV方案transformer网络3D检测 paper&#xff1a;[2110.06922] DETR3D: 3D Object Detection from Multi-view Images via 3D-to-2D Queries code&#xff1a;GitHub - WangYueFt/detr3d DNN提图像特征&#xff0c;FPN提多尺度特征 pts_bbox_head Detr3…

SpringBoot3整合WebSocket

一、WebSocket简介 WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信&#xff0c;允许服务器主动向客户端推送数据。 与传统的 HTTP 请求-响应模式不同&#xff0c;WebSocket 在建立连接后&#xff0c;允许服务器和客户端之间进行双向…

鸿蒙进阶——驱动框架UHDF 机制核心源码解读(一)

文章大纲 引言一、uhdf 概述二、uhdf 的核心参与角色1、drivers/hdf_core/adapter/uhdf2/manager/device_manager.c1.1、drivers/hdf_core/framework/core/manager/src/devmgr_service.c#DevmgrServiceGetInstance通过objectId获取IDevmgrService实例1.2、drivers/hdf_core/fra…

Idea 配合 devtools 依赖 实现热部署

核心依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency> yaml配置 spring: #…

从逻辑学视角严谨证明数据加密的数学方法与实践

文章目录 一、加密数据的数学指纹&#xff1a;信息论基础1.1 加密检测的核心原理1.2 香农熵&#xff1a;量化信息的不确定性 二、统计检验方法&#xff1a;从随机性到加密性2.1 卡方检验的数学原理2.2 游程检验与序列相关性2.3 NIST统计测试套件 三、加密算法的特征识别3.1 对称…

敦煌网测评从环境搭建到风控应对,精细化运营打造安全测评体系

自养号测评&#xff0c;抢占流量为快速提升产品权重和销量&#xff0c;很多卖家常采用自己养号补单测评的方式&#xff0c;技术搭建需要很多要素 一、硬件参数的关联性 在我们使用设备进行注册或操作账号的过程中&#xff0c;系统会记录下大量的系统与网络参数&#xff0c;其中…