- 问题 :我们知道 消息队列 中每次 消费消息 后都会有一个 记录 消费位置的 offset ,但是 假如这个时候消息消费完毕 当你提交offset的可能 遇到系统重启,或者由于 临时紧急情况kill了线程 ,那么但 这个offset没有 正确提交,那么 一旦服务重启,offset还在原来的位置。就会导致 消费重复消费。
- 解决 :实际上这个问题 就是一个 如何 保证数据 幂等性 的问题 ,比较 共识的 解决方法 ,是你在消费端 有一张消息记录表,在插入 消息的时候 可以 判断消费是否是 重复消息,可以通过 一个 全局的ID。如果你是存储在redis中,那么 set方法天然 幂等性 。
- 最后 ,重复消费问题 实际上MQ是无法解决的 ,必须又我们 开发者 自己解决。