我看到Hazelcast 3.12为具有3-7个节点的系统引入了CPSubsystem()
。我了解原因。但是,如果我试图设计一种可以在1-n个节点之间的任何地方运行的解决方案,是否需要使用其他逻辑来验证是否启用了CPSubsystem?我什至怎么检查呢?
我本以为/希望只是打电话
hazelcastInstance.getCPSubsystem().getLock()
无论节点数如何,都可以工作,但是如果少于3个节点,则会抛出异常。而且我找不到任何方法可以检查CPSubsystem
是否启用。
我当前的实现使用不推荐使用的方法getLock()
来获取分布式锁:
LOG.debug("Creating a distributed lock on username for a maximum of 5 minutes {}", username);
ILock usernameLock = hazelcastInstance.getLock(this.getClass().getName() + ":" + username);
try {
if (usernameLock.tryLock (5, TimeUnit.MINUTES)) {
clearUserData(cacheEntryEvent);
}
} catch (InterruptedException e) {
LOG.warn("Exception locking on : {} ", username, e);
LOG.warn("Invoking clearUserData without synchronization : {}", username);
clearUserData(cacheEntryEvent);
} finally {
usernameLock.unlock();
}
如何在不知情的情况下锁定Hazelcast? hazelcastInstance.getLock()
被标记为已弃用,并已在HC4中移除。
答案 0 :(得分:2)
您已经知道,就CPSubsystem
定理而言,CP
是一个CAP
系统。必须明确启用它才能使用,因为它有一些限制和先决条件。其中之一是,群集中至少应存在3个Hazelcast成员。实际上,只有2个成员就足够了,但Hazelcast的CPSubsystem
拒绝与2个成员一起工作,因为2个成员中的大多数又是2个,一旦其中一个成员崩溃,它很可能不可用。
HazelcastInstance.getLock()
使用async replication of Hazelcast,并且在失败时无法提供CP
保证。对于某些系统/应用程序,这很好,但对于所有系统/应用程序,不是。因此,应该在尽力而为的锁定机制与基于CP的锁定机制之间进行选择,并根据此选择来设计依赖于锁定的应用程序。请参阅丹尼尔·阿巴迪(Daniel Abadi)的The dangers of conditional consistency guarantees
帖子,其中涉及此选择。因此,当群集大小小于3时,CPSubsystem().getLock()
不会退回到best-effort/unsafe锁定机制。
HazelcastInstance.getLock()
在3.12中已弃用,在4.0中将被删除。但是,Hazelcast将提供一个unsafe (development) mode for CP data structures,它将与任意数量的成员一起使用,并且将基于类似于Hazelcast AP数据结构的异步复制。
答案 1 :(得分:0)
HazelcastInstance hz1 = Hazelcast.newHazelcastInstance(config);
HazelcastInstance hz2 = Hazelcast.newHazelcastInstance(config);
HazelcastInstance hz3 = Hazelcast.newHazelcastInstance(config);
您可以在同一个JVM / node / instance上添加3个成员。您应该能够在没有三个物理节点,实例或JVM的情况下运行CPSubsystem。