如何在少于 3 个节点的情况下使用 Hazelcast 的 CPSubsystem?

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去除标记。

mdo*_*gan 6

正如您已经知道的那样,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 数据结构的异步复制。