2 回答

TA貢獻(xiàn)1809條經(jīng)驗 獲得超8個贊
CP 子系統(tǒng)旨在在沒有足夠的成員可用于首先形成 CP 子系統(tǒng)時阻止對屬于 CP 子系統(tǒng)系列的數(shù)據(jù)結(jié)構(gòu)的所有操作。此屬性由CPSubsystemConfig.setCPMemberCount(int)
hazelcastInstance.getCPSubsystem().getCPSubsystemManagementService().getCPMembers()
將為您提供集群中的 CP 成員。
要確定集群成員計數(shù),您可以hazelcastInstance.getCluster().getMembers()
對成員加入或離開事件使用和/或使用 MembershipListener。

TA貢獻(xiàn)1860條經(jīng)驗 獲得超9個贊
經(jīng)過幾天的測試,我得出以下結(jié)論:
但是
CPSubsystem
需要至少三個模塊才能開始工作,運行兩個實例就可以了在我提出的最災(zāi)難性的可能場景中(只有一個實例在運行),沒有什么可做的,你的環(huán)境可能有一個 ruff 時間,需要某種干預(yù)或關(guān)注來解決這個中斷
我決定在這種情況下阻止請求被滿足,以保持模塊之間所有操作的一致性。
所以方法如下:
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
將執(zhí)行三個驗證:
如果當(dāng)前應(yīng)用程序注冊在
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();
}
問題來了,簡單地調(diào)用getCPMembers().get()會導(dǎo)致我遇到的長時間暫停(默認(rèn)超時)。
所以我使用了getCPMembers().get(getMemberValidationTimeout(), TimeUnit.SECONDS),如果調(diào)用超過預(yù)期超時,它將拋出錯誤。
添加回答
舉報