亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

配置 Hazelcast CPSubsystem 重試超時

配置 Hazelcast CPSubsystem 重試超時

Qyouu 2023-06-08 19:26:30
目前我在CPSubsystem.      -----      | I1* | * Leader      -----  ----       ---- | I2 |     | I3 | ----       ---- 當所有實例都啟動運行時,所有實例都已注冊并相互查看,CPSubsystem一切都按預期工作。以下調用用于在所有實例之間執行分布式鎖:getHazelcastInstance().getCpSubsystem().getLock(lockDefinition.getLockEntryName())當其中兩個實例死亡時,我注意到一個問題,并且沒有領導者或其他實例可用于執行領導者選舉:      -----      | XXX | * DEAD      -----  ----       ----- | I2 |     | XXX | * DEAD ----       ----- 正在運行的實例然后嘗試獲取分布式鎖,但是請求凍結執行該getLock方法,導致請求排隊幾分鐘(當實例成為子系統中的唯一實例時需要配置超時)。我還注意到以下日志被永久打?。?019-08-16 10:56:21.697  WARN 1337 --- [ration.thread-1] Impl$LeaderFailureDetectionTask(default) : [127.0.0.1]:5702 [dev] [3.12.1] We are FOLLOWER and there is no current leader. Will start new election round...2019-08-16 10:56:23.737  WARN 1337 --- [cached.thread-8] c.h.nio.tcp.TcpIpConnectionErrorHandler  : [127.0.0.1]:5702 [dev] [3.12.1] Removing connection to endpoint [127.0.0.1]:5701 Cause => java.net.SocketException {Connection refused to address /127.0.0.1:5701}, Error-Count: 1062019-08-16 10:56:23.927  WARN 1337 --- [ration.thread-1] Impl$LeaderFailureDetectionTask(default) : [127.0.0.1]:5702 [dev] [3.12.1] We are FOLLOWER and there is no current leader. Will start new election round...有沒有辦法識別實例現在是單獨運行的,如果是這樣,在獲取新鎖的過程中不要阻塞應用程序?我一直在尋找某種機制來不以任何方式阻止應用程序的流程,即使應用程序單獨運行我也會使用常規而j.u.c.l.ReentrantLock不是FencedLock.
查看完整描述

2 回答

?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

CP 子系統旨在在沒有足夠的成員可用于首先形成 CP 子系統時阻止對屬于 CP 子系統系列的數據結構的所有操作。此屬性由CPSubsystemConfig.setCPMemberCount(int)

hazelcastInstance.getCPSubsystem().getCPSubsystemManagementService().getCPMembers()將為您提供集群中的 CP 成員。

要確定集群成員計數,您可以hazelcastInstance.getCluster().getMembers()對成員加入或離開事件使用和/或使用 MembershipListener。


查看完整回答
反對 回復 2023-06-08
?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

經過幾天的測試,我得出以下結論:

  1. 但是CPSubsystem需要至少三個模塊才能開始工作,運行兩個實例就可以了

  2. 在我提出的最災難性的可能場景中(只有一個實例在運行),沒有什么可做的,你的環境可能有一個 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將執行三個驗證:

  1. 如果當前應用程序注冊在CPSubsystem

  2. 如果CPSubsystem

  3. 如果在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),如果調用超過預期超時,它將拋出錯誤。


查看完整回答
反對 回復 2023-06-08
  • 2 回答
  • 0 關注
  • 331 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號