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

时间:2019-07-29 13:55:55

标签: concurrency hazelcast

我看到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中移除。

2 个答案:

答案 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。