您好,登錄后才能下訂單哦!
ZooKeeper異常該怎么解決,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
在Java API中的每一個ZooKeeper操作都在其throws子句中聲明了兩種類型的異常,分別是InterruptedException和KeeperException。
(一)InterruptedException異常
如果操作被中斷,則會有一個InterruptedException異常被拋出。在Java語言中有一個取消阻塞方法的標準機制,即針對存在阻塞方法的線程調用interrupt()。一個成功的取消操作將產生一個InterruptedException異常。
ZooKeeper也遵循這一機制,因此你可以使用這種方法來取消一個ZooKeeper操作。使用了ZooKeeper的類或庫通常會傳播InterruptedException異常,使客戶端能夠取消它們的操作。InterruptedException異常并不意味著有故障,而是表明相應的操作已經被取消,所以在配置服務的示例中,可以通過傳播異常來中止應用程序的運行。
(二)KeeperException異常
(1) 如果ZooKeeper服務器發出一個錯誤信號或與服務器存在通信問題,拋出的則是KeeperException異常。
①針對不同的錯誤情況,KeeperException異常存在不同的子類。
例如: KeeperException.NoNodeException是KeeperException的一個子類,如果你試圖針對一個不存在的znode執行操作,拋出的則是該異常。
②每一個KeeperException異常的子類都對應一個關于錯誤類型信息的代碼。
例如: KeeperException.NoNodeException異常的代碼是KeeperException.Code.NONODE
(2) 有兩種方法被用來處理KeeperException異常:
①捕捉KeeperException異常,并且通過檢測它的代碼來決定采取何種補救措施;
②另一種是捕捉等價的KeeperException子類,并且在每段捕捉代碼中執行相應的操作。
(3) KeeperException異常分為三大類
① 狀態異常
當一個操作因不能被應用于znode樹而導致失敗時,就會出現狀態異常。狀態異常產生的原因通常是在同一時間有另外一個進程正在修改znode。例如,如果一個znode先被另外一個進程更新了,根據版本號執行setData操作的進程就會失敗,并收到一個KeeperException.BadVersionException異常,這是因為版本號不匹配。程序員通常都知道這種沖突總是存在的,也都會編寫代碼來進行處理。
一些狀態異常會指出程序中的錯誤,例如KeeperException.NoChildrenForEphemeralsException異常,試圖在短暫znode下創建子節點時就會拋出該異常。
② 可恢復異常
可恢復的異常是指那些應用程序能夠在同一個ZooKeeper會話中恢復的異常。一個可恢復的異常是通過KeeperException.ConnectionLossException來表示的,它意味著已經丟失了與ZooKeeper的連接。ZooKeeper會嘗試重新連接,并且在大多數情況下重新連接會成功,并確保會話是完整的。
但是ZooKeeper不能判斷與KeeperException.ConnectionLossException異常相關的操作是否成功執行。這種情況就是部分失敗的一個例子。這時程序員有責任來解決這種不確定性,并且根據應用的情況來采取適當的操作。在這一點上,就需要對“冪等”(idempotent)操作和“非冪等”(Nonidempotent)操作進行區分。冪等操作是指那些一次或多次執行都會產生相同結果的操作,例如讀請求或無條件執行的setData操作。對于冪等操作,只需要簡單地進行重試即可。對于非冪等操作,就不能盲目地進行重試,因為它們多次執行的結果與一次執行是完全不同的。程序可以通過在znode的路徑和它的數據中編碼信息來檢測是否非冪等操怍的更新已經完成。
③不可恢復的異常
在某些情況下,ZooKeeper會話會失效——也許因為超時或因為會話被關閉,兩種情況下都會收到KeeperException.SessionExpiredException異常,或因為身份驗證失敗,KeeperException.AuthFailedException異常。無論上述哪種情況,所有與會話相關聯的短暫znode都將丟失,因此應用程序需要在重新連接到ZooKeeper之前重建它的狀態。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。