2 回答
TA贡献1809条经验 获得超8个赞
CP 子系统旨在在没有足够的成员可用于首先形成 CP 子系统时阻止对属于 CP 子系统系列的数据结构的所有操作。此属性由CPSubsystemConfig.setCPMemberCount(int)
hazelcastInstance.getCPSubsystem().getCPSubsystemManagementService().getCPMembers()
将为您提供集群中的 CP 成员。
要确定集群成员计数,您可以hazelcastInstance.getCluster().getMembers()
对成员加入或离开事件使用和/或使用 MembershipListener。
TA贡献1860条经验 获得超9个赞
经过几天的测试,我得出以下结论:
但是
CPSubsystem
需要至少三个模块才能开始工作,运行两个实例就可以了在我提出的最灾难性的可能场景中(只有一个实例在运行),没有什么可做的,你的环境可能有一个 ruff 时间,需要某种干预或关注来解决这个中断
我决定在这种情况下阻止请求被满足,以保持模块之间所有操作的一致性。
所以方法如下:
try {
if( !hz.isCpInstanceAvailable() ) {
throw new HazelcastUnavailableException("CPSubsystem is not available");
}
... acquires the lock ...
} catch (HazelcastUnavailableException e) {
LOG.error("Error retrieving Hazelcast Distributed Lock :( Please check the CPSubsystem health among all instances", e);
throw e;
}
该方法isCpInstanceAvailable
将执行三个验证:
如果当前应用程序注册在
CPSubsystem
如果
CPSubsystem
是如果在
CPSubsystem
所以这是解决方案:
protected boolean isCpInstanceAvailable() {
try {
return getCPLocalMember() != null && getCPMembers().get(getMemberValidationTimeout(), TimeUnit.SECONDS).size() > ONE_MEMBER;
} catch (InterruptedException | ExecutionException | TimeoutException e) {
LOG.error("Issue retrieving CP Members", e);
}
return false;
}
protected ICompletableFuture<Collection<CPMember>> getCPMembers() {
return Optional.ofNullable(getCPSubsystemManagementService().getCPMembers()).orElseThrow(
() -> new HazelcastUnavailableException("CP Members not available"));
}
protected CPMember getCPLocalMember() {
return getCPSubsystemManagementService().getLocalCPMember();
}
问题来了,简单地调用getCPMembers().get()会导致我遇到的长时间暂停(默认超时)。
所以我使用了getCPMembers().get(getMemberValidationTimeout(), TimeUnit.SECONDS),如果调用超过预期超时,它将抛出错误。
添加回答
举报