如果Hazelcast群集实例之一将获得锁定并在锁定状态下死亡,将会发生什么?例如
if (hz.getCPSubsystem().getLock("lockName").tryLock(500, TimeUnit.MILLISECONDS)){
try{
System.exit(0);
}finally {
hz.getCPSubsystem().getLock("lockName").unlock();
}
}
简短版本:CP子系统具有一个会话机制,该机制跟踪所有成员的活动状态。当识别出持有锁的成员死亡时,锁将被释放。如果需要,可以调整会话心跳机制以满足特定应用程序的性能需求。
长版:建议阅读此博客文章:https://hazelcast.com/blog/long-live-distributed-locks/尤其是“如果锁持有人死亡会发生什么”一节。
使这种类型的代码可靠的棘手方面之一是当出现网络问题时发生的事情……例如,锁持有人可能脱机,并且看不到心跳。因此,群集将锁持有者声明为死亡,释放锁,然后将其分配给其他人。然后,锁持有者重新联机并尝试继续处理,以为它仍然具有锁。 Hazelcast中的FencedLock实现将把锁识别为过时的,并且不允许过时的锁的持有者继续进行-他必须重新获取该锁,然后才能执行该锁所涵盖的任何操作。