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