黑马八股--中间件学习之MQ(RabbitMQ)

【新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)】

RabbitMQ

1.模型

发送者-服务器-mq队列-消费者

使用mq

装服务→引依赖→填连接配置→封装收发工具→业务调用。

2.出现问题--丢失消息

1.发送者

发送消息没到服务器

发送消息没到mq

用return来回应ack,2种return代表是哪个端没收到消息

处理方案:重新发送,如果再不行,就记录日志,或者记录到数据库定时扫描重发,成功发送就删除该记录,实在不行人为发送

2.mq宕机

交换机 队列 消息都做持久化,存到磁盘

3.消费者确认

三种:手动调用api,spring监听(一般选择这个),默认消费者成功处理

有异常就重试3次最多,重试不行就记录到数据库,人工解决

总结

3.问题--消息重复消费

MQ 重复消费是因为 ACK 丢失导致消息重试投递,通用解决方案是做消费幂等:

首先给每条消息带上唯一业务 ID(订单 / 支付 ID),消费前先校验 ID 是否已处理;

常用实现有三种:

一是数据库唯一索引天然防重,

二是 Redis预占 ID 做前置防重,

三是乐观 / 悲观锁控制并发更新;

只要保证相同 ID 的消息多次执行业务结果一致 ,就能彻底解决重复消费问题,

优先使用业务自带主键做标识,不要随便生成 UUID,方便线上排查问题。

总结

4.死信交换机延迟队列的了解

死信交换机

TTL

代码示例

延迟队列另外实现方式

总结

完整流程(优惠券例子)

  1. 用户领取优惠券 → 程序发送消息到【等待队列】,设置 TTL=24 小时;
  2. 等待队列没有消费者,消息静默等待倒计时;
  3. 24 小时 TTL 到期,消息变成死信,自动通过死信交换机转发到【业务消费队列】;
  4. 消费者监听到消息,执行判断:
    • 查询数据库,优惠券未使用 → 执行业务,更新为过期(正常消费这条消息);
    • 查询数据库,优惠券已经被核销使用 → 直接忽略,相当于丢弃这条消息

5.消息堆积问题

本质就是 发送>>消费,然后之后的发送就是死信

解决这个问题的话

首先就是消费者这边可以增加消费者数量,或者开启线程池提高消费速度

其次队列的角度就是扩大队列容积,提高堆积上限(另一种队列模式:惰性队列)

总结

6.RabbitMQ高可用机制

队列所在节点宕机,队列中的消息就会丢失

类似 "指针 / 引用",无消息副本、没有自动备份

总结

相关推荐
qq_284274056 小时前
机械设计基础·滚动轴承全解(类型·代号·选型·寿命)+轮系与蜗杆蜗轮传动
笔记·学习·自动化·制造
2603_9651481111 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
kaixin_啊啊13 小时前
【用于更准确 G×E 基因组预测的大规模作物数据集与基于深度学习的多模态融合框架】论文学习
人工智能·深度学习·学习
xier_ran13 小时前
【infra之路】AI 编译器学习笔记(六):重拾 C++——lambda 与 MLIR 中的回调
c++·笔记·学习
别动我齐刘海15 小时前
Linux 系统调试学习2
linux·运维·c++·人工智能·学习·机器学习·机器人
m4Rk_16 小时前
【论文阅读】Agent 记忆机制(99):PrisMem——从整体分数搜索走向能力驱动的记忆自进化
论文阅读·人工智能·学习·开源·github
程序员梅雨17 小时前
ZooKeeper面经总结
java·大数据·linux·分布式·后端·zookeeper·中间件
PC2005-cloud17 小时前
Mysql学习笔记:InnoDB Cluster 集群从零搭建实战,基于 Docker 实现高可用读写分离架构
笔记·学习·mysql
小陈phd17 小时前
深入理解agent学习笔记(七)——动态提示词与Skills
笔记·学习
我命由我1234517 小时前
田野笔记极简理解
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法