Dubbo服務關閉后,ZooKeeper中仍能查到服務信息,這是為什么?

Dubbo服務關閉后,ZooKeeper中仍能查到服務信息,這是為什么?

dubbo服務注冊與zookeeper節點持久化機制詳解

在使用Dubbo框架時,您可能遇到過這種情況:Dubbo服務已關閉,甚至ZooKeeper重啟后,仍能通過ZooKeeper命令查詢到服務信息。本文將深入探討其根本原因。

Dubbo服務注冊并非直接創建節點,而是先創建持久化父節點,再在其下創建臨時子節點存儲服務信息。該臨時節點的生命周期與Dubbo應用運行狀態綁定。正常關閉Dubbo應用后,ZooKeeper客戶端會感知連接斷開,并自動刪除臨時節點。dubbo.registry.retry.period配置項影響客戶端重連頻率和時間,決定節點刪除的時機。

然而,Dubbo應用關閉通常不會主動調用注銷方法(unregister)刪除節點。ZooKeeper依賴客戶端連接狀態判斷節點是否移除。因此,在ZooKeeper客戶端檢測到連接斷開并移除臨時節點前,服務信息依然可見。

ZooKeeper的持久化機制也至關重要。ZooKeeper定期將數據持久化到磁盤,形成快照。如果服務信息在連接斷開前已成功注冊并持久化,即使應用關閉、ZooKeeper重啟,這些信息仍會從磁盤快照恢復到內存。

因此,ls /dubbo命令返回的結果來自ZooKeeper內存數據緩存。即使Dubbo應用已關閉,只要ZooKeeper未清除節點信息,命令就能查詢到。但一旦ZooKeeper客戶端檢測到臨時節點連接丟失并將其從內存緩存移除,再次執行ls /dubbo將無法查詢到該服務信息。這就是為什么即使應用關閉并重啟ZooKeeper,仍能短暫看到之前注冊的服務信息的原因。

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享