Hazelcast lock - 实例死亡

Hazelcast lock - instance death

如果 Hazelcast 集群的其中一个实例获取锁并死于锁定状态,会发生什么情况? 例如

if (hz.getCPSubsystem().getLock("lockName").tryLock(500, TimeUnit.MILLISECONDS)){
    try{
      System.exit(0);
    }finally {
        hz.getCPSubsystem().getLock("lockName").unlock();
    }

}

简短版本:CP 子系统有一个会话机制,可以跟踪所有成员的活跃度。当它识别出持有锁的成员已经死亡时,锁将被释放。如果需要,可以调整会话心跳机制以满足特定应用程序的性能需求。

长版:我建议阅读此博客 post: https://hazelcast.com/blog/long-live-distributed-locks/ 尤其是 'what happens if a lock holder dies' 部分。

使此类代码可靠的一个棘手方面是出现网络问题时会发生什么......例如,锁持有者可能会脱机,并且看不到心跳。所以集群声明锁持有者死亡,释放锁,并将其分配给其他人。然后锁持有者重新上线并尝试继续处理,认为它仍然拥有锁。 Hazelcast 中的 FencedLock 实现会将锁识别为过时锁,并且不允许过时锁的持有者继续 - 他必须在采取锁涵盖的任何操作之前重新获取锁。