您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
JAVA面试如何保证消息不被重复消费?如何保证消息消费的幂等性?
消息,你的,问题JAVA面试如何保证消息不被重复消费?如何保证消息消费的幂等性?
发布时间:2019-02-08加入收藏来源:互联网点击:
其实这是很常见的一个问题,这俩问题基本可以连起来问。既然是消费消息,那肯定要考虑会不会重复消费?能不能避免重复消费?或者重复消费了也别造成系统异常可以吗?这个是 MQ 领域的基本问题,其实本质上还是问你使用消息队列如何保证幂等性,这个是你架构里要考虑的一个问题。
面试题剖析
回答这个问题,首先你别听到重复消息这个事儿,就一无所知吧,你先大概说一说可能会有哪些重复消费的问题。
首先,比如 RabbitMQ、RocketMQ、Kafka,都有可能会出现消息重复消费的问题,正常。因为这问题通常不是 MQ 自己保证的,是由我们开发来保证的。挑一个 Kafka 来举个例子,说说怎么重复消费吧。
Kafka 实际上有个 offset 的概念,就是每个消息写进去,都有一个 offset,代表消息的序号,然后consumer 消费了数据之后,每隔一段时间(定时定期),会把自己消费过的消息的 offset 提交一下,表示“我已经消费过了,下次我要是重启啥的,你就让我继续从上次消费到的 offset 来继续消费吧”。
但是凡事总有意外,比如我们之前生产经常遇到的,就是你有时候重启系统,看你怎么重启了,如果碰到点着急的,直接 kill 进程了,再重启。这会导致 consumer 有些消息处理了,但是没来得及提交 offset,尴尬了。重启之后,少数消息会再次消费一次。
回答于 2019-09-11 08:43:50
真的不好意思,这个我不懂,当然我也可以回答,但是答案肯定是从度娘那里搜来的,是欺骗,我不能那样做,所以抱歉了,无法回答你的问题
回答于 2019-09-11 08:43:50
你的问题都在问一个核心思想:网络传输是不可靠的。
如果你承认这一点,就应该承认无法保证消息不重复消费。即重复的消息和调用不可避免。
既然不可避免,那么就和现实要做的事情一定有矛盾。实际情况是,用户因为自己手机信号不好支付一次失败后,是不希望扣两次费用的。
怎么解决这个矛盾呢? 很简单:“痛快承认,容忍失败”。
具体来说,你在实现消息消费程序时,将每次调用都当做“重复调用”来处理。重复的调用一定都返回成功。要做到这一点,你需要精心设计一个“唯一id”,来保证它的含义和你做的业务含义是吻合的。即“同一件事的id一定相同;不是同一件事id一定不同”。
这样,对于同一个id,无论调用多少次,你的应答都是完全相同(必要时可以告诉他已经几次了),这就是幂等的内涵。
回答于 2019-09-11 08:43:50
太复杂了简短文字难以说明问题,比如说:“Kafka 实际上有个 offset 的概念,就是每个消息写进去,都有一个 offset,代表消息的序号,然后 consumer 消费了数据之后,每隔一段时间(定时定期),会把自己消费过的消息的 offset 提交一下,表示“我已经消费过了,下次我要是重启啥的,你就让我继续从上次消费到的 offset 来继续消费吧”。
回答于 2019-09-11 08:43:50
保证offset的值是准确的,也就是每次消费者消费都是新数据,如何保证offset的准确性呢,首先最优方案就是关闭自动提交,自己使用数据库来维护这个消费者组,主题,分区的offset的值,每次从数据库中取值消费,更新offset,消费失败不更新数据库就好了,不让卡夫卡或者zk来维护这个值。要开启幂等性为true哟。
回答于 2019-09-11 08:43:50
感谢你的邀请,我对这个不太懂,但我只知道只要是消费出去的东西,都很容易被模仿,如果不想被别人重复,那就要让别人挑不出东西的缺陷。
回答于 2019-09-11 08:43:50
这个问题比较犀利,因为我不是这个专业人员,希望有专业人员帮你答复
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |