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

问题:

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

解决方案

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

详解

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

参考关键字

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

参考资料

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

你可能感兴趣的:(JAVA)