Java学习第六十九部分——RabbitMQ

目录

一、前言提要

二、基本信息

1. 关键定义  

2. 核心角色  

3. 交换机类型  

三、消息生命周期与可靠性机制

四、生态集成——与Java

五、应用场景

六、性能与选型对比

七、生产级最佳实践——基于Java

八、应用场景

九、一句话总结


一、前言提要

       Spring AMQP是Spring 框架对 AMQP协议的集成实现,主要用于简化与RabbitMQ等消息中间件的交互。通过Spring AMQP,开发者能以声明式方法快速集成RabbitMQ,兼顾灵活性和易用性。

二、基本信息

1. 关键定义  

       RabbitMQ 是用 Erlang 编写的开源消息代理,实现了 AMQP 0-9-1 协议,同时通过插件支持 MQTT、STOMP 等协议。

2. 核心角色  

   • Producer:消息生产者  
   • Consumer:消息消费者  
   • Broker:RabbitMQ 服务器节点  
   • Virtual Host:逻辑隔离单位(类似 MySQL 的 schema)  
   • Exchange:路由器,决定消息如何投放到队列  
   • Queue:消息暂存区  
   • Binding & Routing Key:决定 Exchange→Queue 的映射规则  
   • Channel:TCP 之上的轻量“会话”,减少连接开销

3. 交换机类型  

   • Direct:路由键全匹配  
   • Fanout:广播到所有绑定队列  
   • Topic:模式匹配(* 单层、# 多层)  
   • Headers:基于消息头 KV 匹配

三、消息生命周期与可靠性机制

1. 发布 → Exchange → 队列 → 消费  
   若消息不能路由,mandatory=true 会返还给生产者,false 则丢弃。

2. 可靠性投递  
   • 生产者 Confirm(异步 ACK/NACK,支持批量)  
   • 事务通道(txSelect/commit/rollback,同步阻塞,性能低)  
   • 持久化:Exchange、Queue、Message 均支持磁盘持久化  
   • 消费端 ACK:手动 ACK、自动 ACK、拒绝并重入队、拒绝并 DLQ

3. 死信队列(DLQ)  
   触发条件:消息被拒、TTL 到期、队列满。通过 policy 设置 `x-dead-letter-exchange` 与 `x-dead-letter-routing-key` 将死信转投到 DLQ。

4. TTL & 延迟消息  
   • 队列级 TTL:`x-message-ttl`  
   • 消息级 TTL:`expiration` 属性(单位 ms)  
   • 延迟投递:官方插件 `rabbitmq_delayed_message_exchange`,利用 `x-delay` 头实现任意延迟。

四、生态集成——与Java

1. 原生 Java Client  
   核心 API:`ConnectionFactory → Connection → Channel → basicPublish / basicConsume`

2. Spring AMQP / Spring Boot Starter  
   • 只需在 `application.yml` 中配置地址、用户名、密码  
   • 通过 `@RabbitListener` 注解声明消费端,支持手动 ACK  
   • 配置示例  

     @Beanpublic DirectExchange directExchange() {return new DirectExchange("order.exchange");}@Beanpublic Queue orderQueue() {return QueueBuilder.durable("order.queue").withArgument("x-dead-letter-exchange", "dlx").build();}@Beanpublic Binding binding() {return BindingBuilder.bind(orderQueue()).to(directExchange()).with("order.create");}

   • 生产者:  

     rabbitTemplate.convertAndSend("order.exchange", "order.create", dto);

   • 消费者:  

@RabbitListener(queues = "order.queue", ackMode = MANUAL)public void onMessage(OrderDto dto, Channel channel, Message message) { ... }

3. 连接池 & 高并发  
   默认 Spring CachingConnectionFactory 已做 Channel 缓存;若极端高并发,可引入 [rabbitmq-client-metrics] 监控连接泄漏。

五、应用场景

场景用法交换机/特性说明
任务异步化下单 → 库存扣减Direct解耦系统、流量削峰
秒杀抢购请求先入队,后台限流消费Topic + TTL + DLQ过期未支付订单自动关闭
日志收集应用集群 → ELKFanout一条日志被多个终端同时消费
延迟通知30 min 后发短信Delayed Exchange延迟插件或 TTL+DLQ 实现
微服务事件总线订单完成事件广播Topic多服务订阅感兴趣的事件

六、性能与选型对比

维度RabbitMQRocketMQKafka
单机吞吐万级 ~ 十万级十万级 ~ 百万级百万级+
消息可靠性
(AMQP 事务/Confirm)

(同步刷盘+主从)
中等
(副本 ISR)
时效性毫秒级毫秒级毫秒级
协议支持AMQP, MQTT, STOMP...自定义协议自定义协议
管理 UI自带丰富 Web UI丰富轻量
适用场景中小规模事务型业务金融级分布式事务大数据/日志流

七、生产级最佳实践——基于Java

1. 资源管理  
   • 一个进程复用一条 TCP Connection,每个线程使用独立 Channel。  
   • 消费端务必关闭 autoAck,改为手动 ACK,避免消息丢失。  
   • 捕获 ShutdownSignalException,记录日志并自动重连。

2. 集群与镜像队列  
   • 普通集群:队列元数据冗余,消息仅驻留单节点 → 高吞吐但有单点风险  
   • 镜像队列(Quorum Queue 新版):消息副本同步到多节点 → 牺牲吞吐换高可用

3. 监控 & 告警  
   • 指标:connection/channel 数、队列积压、磁盘/内存水位、消息速率  
   • Prometheus + Grafana 官方 exporter;或 Spring Boot Actuator 暴露 `/actuator/rabbitmq`

4. 灰度与版本演进  
   • 通过 Virtual Host 隔离不同环境(dev/test/prod)  
   • 使用 Policy 而非代码声明队列/交换机,便于运维动态调整参数

5. 幂等与去重  
   • 每条消息携带全局 MessageId  
   • 消费端在业务层利用数据库唯一键或 Redis SETNX 去重

八、最佳实践

  • RabbitMQ 在 Java 生态中成熟度高、协议完善、管理界面友好,对中小规模系统或需要复杂路由、事务、延迟消息的业务尤为合适。  

  • 通过 Spring Boot 的“约定优于配置”能力,可以快速落地;再配合镜像队列、DLQ、监控、幂等等手段,即可平滑支撑生产级高可用场景。

九、一句话总结

       RabbitMQ 是 Java 生态里“即插即用”的高可靠消息总线,用 Spring-AMQP 两行代码就能完成异步、削峰、延迟与事件驱动。

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

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

相关文章

MDAC2.6问题解决指南:解决.NET Framework数据访问烦恼

MDAC2.6问题解决指南:解决.NET Framework数据访问烦恼 【下载地址】MDAC2.6问题解决指南 MDAC 2.6 问题解决指南为您提供了针对.NET Framework数据提供程序要求使用Microsoft Data Access Components (MDAC) 2.6或更高版本的全面解决方案。本指南详细介绍了如何在开…

会话跟踪模式

一、图片讲了什么?这张图片主要讲的是“会话跟踪技术”,也就是网站怎么记住你是谁、你做了什么。1. 什么是会话?会话(Session)就像你和网站的一次聊天,从你打开网页到关闭网页,这段时间就是一次…

C语言开发工具Win-TC

如你所知,WIN-TC是一个turbo C2 WINDOWS 平台开发工具,最大特点是支持中文界面,支持鼠标操作,程序段复制,为初学 c 语言、对高等编程环境不熟悉的同志们非常有帮助。该软件使用 turbo C2 为内核,提供 WINDO…

lwIP学习记录5——裸机lwIP工程学习后的总结

1、ping包的TTL生存时间如何修改当我们把工程烧录到板子上是,我们对板子的IP进行ping包,看到信息如下图这时候我好奇TTL是什么作用,为什么有的设备是64有的设备是128有的是255?解:TTL(Time to Live&#xf…

利用Trae将原型图转换为可执行的html文件,感受AI编程的魅力

1、UI设计原型效果2、通过Tare对话生成的效果图(5分钟左右)3、查资料做的效果图(30分钟左右))通过以上对比,显然差别不多能满足要求,只需要在继续优化就能搞定; 4、Trae生成的源码&l…

Chessboard and Queens

题目描述Your task is to place eight queens on a chessboard so that no two queens are attacking each other. As an additional challenge, each square is either free or reserved, and you can only place queens on the free squares. However, the reserved squares …

菜鸟教程R语言一二章阅读笔记

菜鸟教程R语言一二章阅读笔记 一.R语言基础教程 R 语言是为数学研究工作者设计的一种数学编程语言,主要用于统计分析、绘图、数据挖掘。侧重于数学工作者 R语言特点如下: R 语言环境软件属于 GNU 开源软件,兼容性好、使用免费 语法十分有利于…

Tactile-VLA:解锁视觉-语言-动作模型的物理知识,实现触觉泛化

25年7月来自清华、中科大和上海交大的论文“Tactile-VLA: Unlocking Vision-Language- Action Model’s Physical Knowledge For Tactile Generalization ”。 视觉-语言-动作 (VLA) 模型已展现出卓越的成就,这得益于其视觉-语言组件丰富的隐性知识。然而&#xff0…

HTML初学者第五天

<1>表格标签1.1基本语法<table><tr><td>单元格内的文字</td>...</tr>... </table>1.<table></table>是用于定义表格的标签。2.<tr></tr>标签用于定义表格中的行&#xff0c;必须嵌套在<table></ta…

FastAPI入门:demo、路径参数、查询参数

demo from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}在终端运行 fastapi dev main.py结果如下&#xff1a;打开http://127.0.0.1:8000&#xff1a;交互式API文档&#xff1a;位于h…

pytest中的rerunfailures的插件(失败重试)

目录 1-- 安装rerunfailures插件 2-- rerunfailures的使用 3-- 重试案例 安装rerunfailures插件 pip install pytest-rerunfailures点击左下角的控制台面板 输入 pip install pytest-rerunfailures 出现上图的情况就算安装完成了 rerunfailures的使用 可以添加一下参数使用&…

SpringMVC——建立连接

建立连接 将用户&#xff08;浏览器&#xff09;和java程序连接起来&#xff0c;也就是访问一个地址能够调用到我们的Spring程序。在 Spring MVC 中使用 RequestMapping来实现URL 路由映射&#xff0c;也就是浏览器连接程序的作用。 1.RequestMapping注解介绍 RequestMapping…

蘑菇云路由器使用教程

1: 手机连接路由器的Wi-Fi&#xff0c;在浏览器输入背面IP地址&#xff1a;192.168.132.1进入路由管理界面1.1: 电脑连接路由器网线在浏览器输入背面IP地址&#xff1a;192.168.132.1进入路由管理界面账号&#xff1a;admin密码&#xff1a;123456782:选择上网模式2.1&#xff…

ubuntu的tar解压指令相关

1. 指令说明参数作用-xextract&#xff0c;解包-z通过 gzip 解压&#xff08;.tar.gz、.tgz&#xff09;-vverbose&#xff0c;显示过程-ffile&#xff0c;后面紧跟压缩包文件名2. 什么时候用z参数场景是否加 -z结果.tar.gz / .tgz✅ 必须加 -z正常解压.tar.gz / .tgz❌ 没加 -…

车载诊断刷写 --- Flash关于擦除和写入大小

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

【Verilog HDL 入门教程】 —— 学长带你学Verilog(基础篇)

文章目录一、Verilog HDL 概述1、Verilog HDL 是什么2、Verilog HDL产生的背景3、Verilog HDL 和 VHDL的区别二、Verilog HDL 基础知识1、Verilog HDL 语言要素1.1、命名规则1.2、注释符1.3、关键字1.4、数值1.4.1、整数及其表示1.4.2、实数及其表示1.4.3、字符串及其表示2、数…

SQL Developer Data Modeler:一款免费跨平台的数据库建模工具

SQL Developer Data Modeler 是由 Oracle 公司开发的一款免费的图形化数据建模和数据库设计工具&#xff0c;用于创建、浏览和编辑逻辑模型、关系模型、物理模型、多维模型和数据类型模型。 SQL Developer Data Modeler 既是一个独立的应用程序&#xff0c;同时也被集成到了 Or…

CSS面试题及详细答案140道之(21-40)

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

篇四 tcp,udp客户端服务器编程模型

一 前言 本篇内容主要介绍tcp&#xff0c;udp客户端服务器编程的基础API和示例代码。 二 APIAPI用途使用方socket创建套接字&#xff0c;这是网络通信的桥梁Tcp,udp客户端&#xff0c;服务器bind绑定本地IP地址和端口Tcp,udp客户端&#xff0c;服务器listen监听端口&#xff0c…

ESP32学习笔记_Components(1)——使用LED Strip组件点亮LED灯带

LED strip ESP32-S3 的 RMT&#xff08;Remote Control Transceiver&#xff0c;远程控制收发器&#xff09;外设最初设计用于红外收发&#xff0c;但由于其数据格式的灵活性&#xff0c;RMT 可以扩展为通用的信号收发器&#xff0c;能够发送或接收多种类型的信号&#xff1b;…