消息重复消费问题
为什么会出现重复消费?
原因一:生产者消息重复发送
可能出现的情况
- 生产者发送消息给消息中间件,消息中间件收到消息并进行存储,但是此时消息中间件出现了问题,导致生产者没有收到发送成功的返回,导致的消息重试
- 消息中间件因为负载高响应变慢,成功把消息存储到消息存储后,返回成功超时,导致的消息重试
- 消息中间件将消息成功写入消息存储后,在返回结果时网络出现问题,导致消息重试
解决方案
- 在消息中加入一个唯一id,这样消息重试也不会造成数据重复,在进行处理时需要判断id
原因二:消息中间件投递时重复
- 消息被投递到消费者时,处理完毕后应用出现问题,没有返回消费成功,此时消息中间件再次投递
- 消息被投递到消费者进行处理,处理完毕后网络出现问题,导致消息中间件没有收到消息处理结果,再次投递
- 消息被投递到消费者进行处理,处理时间超时,导致再次投递
- 消息被投递到消费者进行处理,处理完毕后消息中间件出现问题,没有收到消息处理结果,再次投递
- 消息被投递到消费者进行处理,处理完毕后消息中间件收到结果,但是消息存储故障,没有更新投递状态,再次投递
解决方案
- 在消息中加入一个唯一id,这样消息重试也不会造成数据重复,在进行处理时需要判断id