跳至主要內容

程序员小富大约 2 分钟

一、什么是消息幂等性

幂等性原本是一个数学概念,在编程领域,对于 MQ 消息来说,幂等性意味着对同一条消息的多次消费所产生的效果与一次消费相同。也就是说,无论消息被消费了多少次,系统的状态都不会因为重复消费而改变。

二、为什么要保证消息幂等性

(一)网络问题导致的重复投递

网络的不稳定性可能导致消息在传输过程中出现延迟、丢包等情况。为了确保消息能够被正确处理,MQ 通常会有重试机制。但这种重试可能会导致消息被重复发送到消费者端,如果没有幂等性保证,就可能引发数据不一致等问题。

(二)消费者业务逻辑重试

在消费者处理消息的过程中,可能会因为业务逻辑执行失败(如数据库连接超时、业务规则校验不通过等)而进行重试。这也可能导致同一条消息被多次处理。

MQ消息重复的产生原因

(一)网络抖动

网络环境有很多的不确定性,偶尔会出现网络抖动的情况。当消息从生产者发送到 MQ 服务器,或者从 MQ 服务器传递到消费者的过程中,网络抖动可能会导致消息传输出现异常。例如,在消息已经成功发送到 MQ 服务器,但 MQ 服务器向生产者返回确认消息(ACK)时,由于网络抖动,生产者没有收到 ACK。这种情况下,生产者可能会认为消息发送失败,从而进行重试发送,导致 MQ 服务器收到重复的消息,进而引发消费者对消息的重复消费。

(二)网络延迟

网络延迟也可能引起消息重复消费。如果消息在传输过程中的延迟时间过长,超过了生产者或 MQ 服务器设置的超时时间,同样会被认为是发送失败而进行重试。例如,在一个高并发的场景下,网络拥塞导致消息传输延迟,生产者的重试机制被触发,使得相同的消息被多次发送到 MQ,增加了消费者重复消费的可能性。

参考文献

https://mp.weixin.qq.com/s/EeYNJJMKkJOFHBV9w0oDUg