
解决办法:
1)事务机制:(同步方式,不推荐)
对于RabbitMQ来说,生产者发送数据之前开启RabbitMQ的事务机制 channel.txselect,如果消息没有进队列,则生产者受到异常报错,并进行回滚channel.txRollback,然后重试发送消息。如果收到了消息,则可以提交事务channel.txCommit。这是同步操作,会影响性能。
2)异步机制:
/confirm/i模式来解决同步机制的性能问题。每次生产者发送的消息都会分配一个唯一的id,如果写入到了RabbitMQ队列中,则RabbitMQ会回传一个ack消息,说明这个消息接收成功。如果RabbitMQ没能处理这个消息,则回调nack接口。说明需要重试发送消息。
也可以自定义超时时间 + 消息 id 来实现超时等待后重试机制。但可能出现的问题是调用ack接口时失败了,所以会出现消息被发送两次的问题,这个时候就需要保证消费者消费消息的幂等性。
事务模式和/confirm/i模式的区别:
解决办法:
解决办法:
遗留问题:那这种主动 ack 有什么漏洞了?如果 主动 ack 的时候挂了,怎么办?
来这儿——消息中间件MQ场景常见问题(消息丢失,重复消费,垃圾消息,延时消费)