普通业务控制幂等性
1.mysql唯一索引
2.token机制(请求前生成一个token,请求时携带这个token,如果这个token在redis中没有则继续,有则 有请求进行中)
3.mysql悲观锁,乐观锁(推荐使用乐观锁)
4.分布式锁(redis,zookeeper)
问题的原因
我看先来看下整个流程,怎么会出现重复的消息呢?
生产者 -> MQ -> 消费者
1.生产者发送了多条同样的消息到MQ
2.一条消息消费了多次(在生产者只发送了一条消息的情况下,消费者消费完成,再给MQ发生消息确认这条消息消费完成,但是网络异常或服务中断,MQ没有收到确认。此时MQ不会删除此消息,下次再把这条消息给到消费者)
问题1 解决方案
只要保证消息生成者不重复发送消息给MQ即可
问题2 解决方案(主要问题)
1.mysql唯一索引
2.token机制,消费者消费时去查询redis中是否存在,不存在 去消费并把token存入redis。存在 消息不处理。