RabbitMQ
使用
java 项目中引入以下两个依赖即可
<dependencies>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
场景
解耦、异步、削峰
工作模式
- 简单模式
- work 工作模式
- pub/sub 发布订阅模式
- Routing 路由模式
- Topic 主题模式
如何保证消息的可靠性
消息到 MQ 的过程中搞丢,MQ 自己搞丢,MQ 到消费过程中搞丢。
- 生产者到 RabbitMQ:事务机制和 Confirm 机制(推荐)注意:事务机制和 Confirm 机制是互斥的,两者不能共存,会导致 RabbitMQ 报错。
- RabbitMQ 自身:持久化、集群、普通模式、镜像模式。
- RabbitMQ 到消费者:basicAck 机制、死信队列、消息补偿机制。
死信队列
DLX,全称为 Dead-Letter-Exchange,死信交换器,死信邮箱。当消息在一个队列中变成死信 (dead message)
之后,它能被重新被发送到另一个交换器中,这个交换器就是 DLX,绑定 DLX 的队列就称之为死信队列。
导致的死信的几种原因:
- 消息被拒(Basic.Reject /Basic.Nack) 且 requeue = false。
- 消息 TTL 过期。
- 队列满了,无法再添加。
延迟队列
通过死信队列模拟延迟队列
重复消费(幂等性问题)?
- 都是针对的消费方
- 不论是手动确认还是自动确认都有可能因为网络问题导致消息重复下消费
消费方保证业务幂等性
每条消息增加唯一标识,消费消息后,修改的状态为以消费,若重复消费到消息,可根据唯一标识进行判断,然后不做业务处理
如何保证消息有序?
保证投放到消息队列中的有序,同时保证消费端只有一个实例进行消费
消息积压问题?
消息生产方与消费方能力不平衡导致
增加消费者实例