如何在多消费者环境中保证单用户任务不并发?

针对单用户多任务并发支付导致金额错误的问题,本文探讨了两种解决方案:一是采用分布式锁确保同一时间只有一个线程操作;二是通过哈希取余创建多个队列,实现分组单线程处理。前者虽实现简便但存在额外开销,后者则需考虑动态负载均衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

 在队列中一个用户存在10个需要加钱的任务,多个消费者同时获取到了一个任务,在执行时发生了并发导致加钱金额减少

解决方案

1,在多个者中使用分布式锁保证单个用户的锁同时只能有一个线程持有
2,将uid哈希后/10取余,建立0-9的10个队列,每个队列一个线程

详解

分布式锁方案会导致存在不必要的加锁/释放锁的消耗,但是实现最简单最快
hash取余方案实际上是将多线程变成分组单线程任务,后期建议升级为一致性哈希环的方案实现动态负载
问题实际上是单队列多消费者转为为多队列单消费者,分而治之

参考关键字

一致性哈希环,fork/join,SkipList/TreeMap

参考资料

RocketMQ之八:水平扩展及负载均衡详解-统一哈希模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值