MQ消息丢失问题
-
如何保证消息的可靠性传输
-
可能原因:生产者丢了,mq自己丢了,消费者丢了
1.rabbitMq
- 1、生产者丢数据:写消息的过程中,消息在网络传输的过程中丢失,没到mq
- 解决方案:
- ①.事务机制:同步阻塞,会降低吞吐量
- 解决方案:
channel.select();
try{
//发送消息
}catch(Exception e){
channel.txRollBack
//重试
}
channel.txCommit
- ②. confirm机制:基于回调,异步不阻塞。推荐使用,提升吞吐量
channel.confirm
//发送消息
//实现成功和失败的回调方法
//可以在失败的回调中重试
- 2、 rabbitMq丢数据:接收到消息后先暂存在内存中,在持久化到磁盘之前rabbitMq挂掉导致丢失
- 解决方案:设置持久化,第一创建queue的时候将其设置为持久化的,这样可以保证持久化queue的元数据,但是不会持久化queue里的数据;第二是将deliveryMode设置为2,即将消息设置为持久化。
- 而且持久化可以跟生产者即confirm机制配合起来,只有消息被持久化到磁盘之后,才会通知生产者ack了。
- 3、 消费者丢数据:打开了消费者autoAck机制,消费的时候还没处