最近改了改自己的简历,然后试了试水,收到了很多面试邀请,于是去热热身,一来提升一下自己的语言组织能力,二就是给自己做一些查漏补缺,天天码业务代码有时候一些很简单基础的东西反而忘得干净。
今天随便面了一家小公司,经过一个多小时的面试,所有的问题都答的很流畅,但是在一个很简单的地方卡住了,面试官问了我一个问题:
RabbitMQ如何保证消息不重复消费?
这是一个很简单的问题,但是当时我想茬了,我想到了如何防止消息不丢失,然后一下没回忆起来,卡了一会。好在面试官提示了我如何做分布式幂等校验,我就顺着答了下去。
面试完之后,自然是觉得自己十分菜鸡,不得不重新复习了一下MQ的这一块内容,然后整理了一个笔记。
RabbitMQ保证消息不丢失
首先,要搞清楚RabbitMQ在哪些地方可能丢失消息:
- 生产者发送给MQ的时候丢失了。
- MQ收到了消息,但是发送给消费者的时候丢失了。
- 消费者收到了消息但是因为程序异常没有消费消息。
1.解决生产者消息丢失
解决生产者发送给MQ的消息不丢失,首先,我们可以用MQ的事务,在提交失败之后可以做事务回滚,然后重新提交,但是事务是串行的,性能不是很好,所以我们可以使用confirm模式来处理生产者的消息丢失问题,废话不说先上代码:
public class ConfirmProd {
private static final Stri