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

来源:9-3 curator与spring的整合

有丶小帅

2019-04-15

老师你好。我使用你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

写回答

1回答

风间影月

2019-04-15

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

0
2
风间影月
回复
有丶小帅
是的,这样的话代码逻辑会再稍微复杂一些,这个效应就可以避免了
2019-04-15
共2条回复

ZK分布式专题与Dubbo微服务入门,成长与加薪必备

进阶中高级工程师必备技能,大数据与微服务最常用的中间件

1859 学习 · 321 问题

查看课程