我看到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();
}我怎么能在不知道的情况下用黑兹尔卡斯特锁上锁呢?hazelcastInstance.getLock()被标记为不推荐使用,并在HC4中作为删除的目标。
发布于 2019-07-29 15:53:16
正如你已经知道的,CPSubsystem在CAP定理方面是一个CP系统。它必须显式启用才能使用,因为它有一些限制和先决条件。其中之一是,应至少有3名哈泽尔卡斯特成员加入该专题组。实际上,2个成员就足够了,但是Hazelcast的CPSubsystem拒绝与2个成员一起工作,因为2个成员中的大多数是2,而且一旦其中一个成员崩溃,它很容易不可用。
HazelcastInstance.getLock()使用Hazelcast的异步复制,不能在失败时提供CP保证。对于某些系统/应用程序来说,这是可以接受的,但对所有系统/应用程序来说并不是这样。这就是为什么在最好的锁定机制和基于CP的锁定机制之间的选择应该是显式的,依赖锁的应用程序应该根据这种选择来设计。请参阅丹尼尔·阿巴迪的有条件的一致性保证的危险帖子中有关此选择的内容。这就是为什么当集群大小小于3时时,CPSubsystem().getLock()不会退回到尽最大努力/不安全锁定机制。
HazelcastInstance.getLock()在3.12中被弃用,在4.0中将被删除。但是Hazelcast将提供一个) CP数据结构的模式,它将与任意数量的成员一起工作,并且将基于类似于Hazelcast AP数据结构的异步复制。
发布于 2019-08-19 11:03:05
HazelcastInstance hz1 = Hazelcast.newHazelcastInstance(config);
HazelcastInstance hz2 = Hazelcast.newHazelcastInstance(config);
HazelcastInstance hz3 = Hazelcast.newHazelcastInstance(config);您可以在同一个JVM /节点/实例中添加3个成员,您应该能够在没有三个物理节点、实例或JVM的情况下运行CPSubsystem。
https://stackoverflow.com/questions/57255403
复制相似问题