前面的设计有一个缺点就是锁的粒度比较大。举个例子,有个商品服务-检查库存,订单服务-创建订单,只有当库存大于订单里的商品数量时,才创建订单。
上面的设计缺陷是,无论订单的商品是否相同,都去获得同一个锁,实际上,不同的商品应该申请不同的锁。
/locks/distributed_lock -->/locks/distributed_lock[id]
locks是总节点,永久节点;distributed_lock[id]必须为临时节点,这样在session异常断开的情况下,可以释放锁。
在AdvancedDistributedLock里需要把原来的计数器
// 用于挂起当前请求,并且等待上一个分布式锁释放
private static CountDownLatch zkLatch = new CountDownLatch(1);
更改为
private static Map<String, CountDownLatch> zkLatchMap = new HashMap();
网友评论