分布式项目中的消息队列MQ
·
一、MQ相关概念:
消息队列(Message Queue,MQ):是一种跨进程、异步通信的中间件,用来在分布式系统中传递消息。简单理解:生产者发消息 → MQ 暂存 → 消费者取消息,实现解耦、异步、削峰。
| 名词 | 含义 |
|---|---|
| Producer | 消息生产者(发送消息) |
| Consumer | 消息消费者(接收消息) |
| Broker | MQ 服务器节点 |
| Queue | 队列(存储消息) |
| Topic | 主题(发布订阅模式) |
| Message | 消息体 |
| Ack | 消息确认(保证不丢失) |
二、MQ 的作用--为什么要用 MQ?
1. 系统解耦(最核心)
- 不直接调用接口,通过消息通信
- 下游系统故障不影响上游
- 扩展性极强
2. 异步处理
- 主线程不等待,直接返回
- 提升响应速度、用户体验
3. 流量削峰(秒杀 / 高并发必备)
- 瞬间流量先进入队列
- 消费者按能力消费,防止压垮数据库 / 服务
4. 最终一致性
- 分布式事务解决方案(可靠消息)
5. 错峰流控
- 夜间 / 低峰处理耗时任务
三、两种消息模式
1. 点对点模式(Queue)
- 一个消息只能被一个消费者消费
- 典型:任务分发、订单处理
2. 发布 / 订阅模式(Topic)
- 一个消息可以被多个消费者消费
- 典型:日志广播、通知推送
四、Java 主流 MQ 对比
| MQ | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| RabbitMQ | 易用、稳定、功能全、延时队列 | 吞吐量一般 | 中小企业、金融、电商 |
| RocketMQ | 高吞吐、高可用、阿里出品 | 社区一般 | 高并发、电商、秒杀 |
| Kafka | 超高吞吐、大数据生态 | 功能少 | 日志、流处理、大数据 |
| ActiveMQ | 老牌、轻量 | 性能差,不推荐生产 | 老旧项目 |
- 一般业务:RabbitMQ / RocketMQ
- 大数据 / 日志:Kafka
五、常见问题:
1. 消息重复消费(如何解决?)
原因:网络波动、重试机制导致消息重复投递
解决方案:消费端幂等性(执行多次结果一致)
- 唯一 ID + Redis 判断;数据库唯一键;状态机判断
2. 消息丢失(如何保证不丢?)
从三个环节保证:
- 生产者 → MQ:使用事务消息 / 确认机制(Confirm)
- MQ 自身:开启持久化
- MQ → 消费者:手动 Ack,消费完再确认
3. 消息堆积(如何解决?)
原因:消费者速度 < 生产者速度解决方案:
方案: 增加消费者数量;优化消费逻辑;批量消费;清理无效消息
总结:
以上是Java分布式项目中常涉及到的消息队列相关概念,下一篇将结合Springboot 的项目应用来详细记录MQ的使用和注意事项。
更多推荐
所有评论(0)