NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
## 什么是幂等性 1. 可以借鉴数据库的乐观锁机制; 2. 比如我们执行一条更新库存的SQL语句; 3. 幂等性就是无论执行多少次,结果都是唯一的; ``` update t_reps set count = count - 1 ,version = version + 1 where version = 1; //当两个并发请求过来时,可以通过检查version的版本号来避免count = -1的情况; ``` ## 消费端-幂等性保障 在海量订单产生的业务高峰期,如果避免消息的重复消费,消息重复投递; 1. 消费端实现幂等性,就意味着,我们的消息永远不会消费多次,即使我们收到了多条一样的消息; 2. 唯一ID + 指纹码 机制,利用数据库主键去重; 3. 利用Redis的原子性去实现; ## 唯一ID + 指纹码 机制 简单的说就是将处理过的消息入库,并且保证有一个唯一识别的标识,当相同的消息再接收到的时候,先去数据库中查询,如果查询到有这条记录,那么就不进行这条消息的消费而直接丢弃; 1. select count(1) from t_order where id = 唯一ID + 指纹码; 2. 好处:实现简单; 3. 坏处:高并发下有数据库写入的性能瓶颈; 4. 解决方案:跟进ID进行分库分表进行算法路由; ## 利用Redis原子特性实现 因为Redis是单线程的,所以它是原子性的,那么可以使用setex来保证原子性,如果这个值存在,那么就说明此消息被处理过了,则丢弃; **使用Redis进行幂等,需要考虑的问题:** 1. 我们是否需要进行数据库落库,如果落库的话,关键解决的问题是数据库和缓存如何做到原子性;第一条数据来了,记录到Redis了,结果在入库的时候失败了,那么就造成了数据的不同步;事务是没有办法解决的; 2. 如果我们不进行落库,那么都存到缓存中,如何设置定时同步的策略;数据不可能一直放在缓存中.缓存也是不靠谱的;