影响消息正常发送和消费的重要原因是网络的不确定性。
引起重复消费的原因
1)ACK
正常情况下在consumer真正消费完消息后应该发送ack,通知broker该消息已正常消费,从 queue中剔除
当ack因为网络原因无法发送到broker,broker会认为词条消息没有被消费,此后会开启消息 重投机制把消息再次投递到consumer
2)消费模式
在CLUSTERING模式下,消息在broker中会保证相同group的consumer消费一次,但是针 对不同group的consumer会推送多次
解决方案
1)数据库表
处理消息前,使用消息主键在表中带有约束的字段中insert
2)Map
单机时可以使用map ConcurrentHashMap -> putIfAbsent guava cache
3)Redis
分布式锁搞起来。