0x21【RabbitMQ】幂等性
1、幂等性是什么?
- 我们可以借鉴数据库的乐观锁机制;
- 比如我们执行一条更新库存的SQL语句
UPDATE T_DEPS SET COUNT= COUNT-1 ,VERSION = VERSION+1 WHERE VERSION = 1;
- 每次更新时都进行版本的+1操作,这样别的操作再来对上一个版本的数据进行更新就会更新失败,找不到之前的数据了。
- ==一句话==:多线程对一件事情执行一个操作,这个操作可能执行100次,1000次,最终的结果都是相同的。
2、消费端-幂等性保障
2.1、在海量订单产生的业务高峰期,如何避免消息的重复消费问题?
- 消费端实现幂等性,就意味着,我们的消息永远不会消费多次,即使我们收到了多条一样的消息。
2.2、业界主流的幂等性操作
- 唯一ID+指纹码 机制,利用数据库主键去重
select count(1) from t_order where ID = 唯一ID + 指纹码- 好处:实现简单;
- 坏处:高并发下有数据库写入的性能瓶颈;
- 解决方案:跟进ID进行分库分表进行算法路由。
- 利用Redis的原子性去实现。
- 使用Redis进行幂等,需要考虑的问题:
- 第一:我们是否要进行数据落库,如果落库的话,关键解决的问题是数据库和缓存如何做到原子性?
- 第二:如果不进行落库,那么都存储到缓存中,如何设置定时同步的策略。
- 使用Redis进行幂等,需要考虑的问题:
3、Redis的原子性
- Redis是单进程单线程的网络模型,用的是epoll网络模型,网络模型都是单线程异步非阻塞处理网络请求 ;
- Redis提供的所有API操作,相对于服务端方面都是one by one执行的,命令是一个接着一个执行的,不存在并行执行的情况。
- Redis的单线程处理所有的客户端连接请求,命令读写请求
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果