Eri*_* B. 4 concurrency hazelcast
我看到 Hazelcast 3.12 引入了CPSubsystem()具有 3-7 个节点的系统。我明白其中的道理。但是,如果我试图设计一个可以在 1-n 个节点之间的任何地方运行的解决方案,我是否需要使用不同的逻辑来验证 CPSubsystem 是否已启用?我什至如何检查?
我会想/希望只是打电话
hazelcastInstance.getCPSubsystem().getLock()
Run Code Online (Sandbox Code Playgroud)
无论节点数量如何,都可以工作,但如果节点少于 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();
}
Run Code Online (Sandbox Code Playgroud)
如何在不知道这一点的情况下获得 Hazelcast 的锁定?在hazelcastInstance.getLock()为过时和有针对性的对HC4去除标记。
正如您已经知道的那样,CPSubsystem是一个CP系统CAP定理。它必须明确启用才能使用,因为它有一些限制和先决条件。其中之一是,集群中至少应存在 3 个 Hazelcast 成员。实际上,2个成员就足够了,但是HazelcastCPSubsystem拒绝与2个成员一起工作,因为2个成员中的大多数又是2个,并且一旦其中一个成员崩溃,就很容易无法使用。
HazelcastInstance.getLock()使用Hazelcast 的异步复制,并且不能CP在故障情况下提供保证。这适用于某些系统/应用程序,但不适用于所有系统/应用程序。这就是为什么在尽力而为锁定机制与基于 CP 的锁定机制之间进行选择应该是明确的,并且依赖于锁定的应用程序应该根据这种选择进行设计。请参阅 Daniel Abadi 的条件一致性保证的危险
与此选择相关的帖子。这就是为什么当集群大小低于 3 时,CPSubsystem().getLock()不会回退到尽力而为/不安全的锁定机制。
HazelcastInstance.getLock()在 3.12 中已弃用,并将在 4.0 中删除。但是 Hazelcast 将为CP 数据结构提供不安全(开发)模式,该模式将与任意数量的成员一起使用,并且将基于类似于 Hazelcast AP 数据结构的异步复制。
| 归档时间: |
|
| 查看次数: |
1221 次 |
| 最近记录: |