重复消费产生原因:
在防止消息丢失的方案中,如果生产者发送完消息后,因为网络抖动,没有收到ack,但实际上broker已经收到了。此时生产者会进行重试,于是broker就会收到多条相同的消息,而造成消费者的重复消费。
解决方案:
生产者端:
关闭重试(会造成丢消息,不建议)
消费者端:
解决非幂等性消费问题。
(1)在数据库中创建联合主键,防止相同的主键创建出多条记录。
(2)使用分布式锁,以业务id为锁。 保证只有一条记录能够创建成功。
拓展:幂等性
所谓的幂等性:多次访问的结果是一样的。对于rest的请求(get (幂等)、post (非幂等)、put (幂等)、delete (幂等) )。
分布式锁的三种实现方式
1、基于数据库实现分布式锁。
2、基于缓存(Redis等)实现分布式锁。
3、基于Zookeeper实现分布式锁。
从性能角度(从高到低)来看:“缓存方式>Zookeeper方式>=数据库方式”。



