在网络延迟等不可控的因素下,消息被重复发送的问题不可避免,但是我们应该保证我们的消息不被重复消费。
如何解决?
在消费的业务逻辑里加入保证MQ重复消费的幂等性的操作。
什么是幂等性?
其任意多次执行多产生的影响均与一次执行的影响相同。
如何保证幂等性?
从业务的实际操作划分解决方案
- 仅使用消息进行数据库插入操作:给消息加一个唯一主键,重复消费时会主键冲突。
- 仅使用消息做redis的set操作:无需处理,set本身幂等。
- 其他情况:利用第三方介质记录消费日志,给消息分配一个全局id,只要消费过该消息,则将k-v写入介质中,消费前先检查,如果已经消费过则不再消费。
以上总结参考:https://mp.weixin.qq.com/s/sUQmVDw-XDxrFYpIyWbYGw、https://mp.weixin.qq.com/s/RW8dwgCODAqrjdFElMo45w、https://mp.weixin.qq.com/s/Ur9173kJ6DbrsD8DRwJE4w、https://mp.weixin.qq.com/s/sB5HjHr0neS07zvkz3OSjg