请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

zookeeper分布式锁在高并发下获取锁耗时太久

老师你好。我使用你zookeeper分布式锁的实现做了一个减库存的业务。线程先获取到锁,然后访问redis获取库存,之后释放锁。
问题:当200并发的时候,会有超过几分钟才能获取到锁的情况。
环境:在本地虚拟机里面开启一个zookeeper服务。
我在线程等待的时候使用的是countDownLatch.await(1000*60, TimeUnit.MILLISECONDS)。这个应该不会造成获取锁太久的现象。
请老师和各位同僚帮我看看大概是什么问题。
主要业务代码如下:

##获取锁
zookeeperDistributedLock.getLock();
##获取库存
Integer stock = redisLock.get(ProductConst.PRODUCT_STOCK_PREFIX_KEY, input.getProductId(), redisDB, ProductConst.PRODUCT_STOCK_KEY_EXPIRE);
int r = stock - input.getProductQuantity();
##减库存
redisLock.set(ProductConst.PRODUCT_STOCK_PREFIX_KEY, input.getProductId(), String.valueOf(r), ProductConst.PRODUCT_STOCK_KEY_EXPIRE);
##释放锁
zookeeperDistributedLock.releaseLock();

ps:我的zookeeper版本是3.4.13
curator版本是2.9.0

正在回答 回答被采纳积分+3

1回答

风间影月 2019-04-15 22:53:19

Zk的分布式锁在并发下的确性能会有损耗,所以往往会用redis来做分布式锁会更好

0 回复 有任何疑惑可以回复我~
  • 提问者 有丶小帅 #1
    刚刚查了一下,我们这种实现会产生惊群效应,即当释放锁之后,会使得所有线程去获取锁。一种好的解决方案是创建临时顺序节点。
    回复 有任何疑惑可以回复我~ 2019-04-15 23:11:02
  • 风间影月 回复 提问者 有丶小帅 #2
    是的,这样的话代码逻辑会再稍微复杂一些,这个效应就可以避免了
    回复 有任何疑惑可以回复我~ 2019-04-15 23:24:18
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信