1. 程式人生 > >[從原始碼學設計]螞蟻金服SOFARegistry之續約和驅逐

[從原始碼學設計]螞蟻金服SOFARegistry之續約和驅逐

# [從原始碼學設計]螞蟻金服SOFARegistry之續約和驅逐 [TOC] ## 0x00 摘要 SOFARegistry 是螞蟻金服開源的一個生產級、高時效、高可用的服務註冊中心。 本系列文章重點在於分析設計和架構,即利用多篇文章,從多個角度反推總結 DataServer 或者 SOFARegistry 的實現機制和架構思路,讓大家藉以學習阿里如何設計。 本文為第十五篇,介紹續約和剔除。 ## 0x01 業務範疇 續約和剔除是服務註冊與發現的重要功能,比如: ### 1.1 失效剔除 有些時候,我們的服務例項並不一定會正常下線,可能由於記憶體溢位,網路故障等原因使服務不能正常工作,而服務註冊中心未收到”服務下線“的請求。 為了從服務列表中將這些無法提供服務的例項剔除。Server在啟動的時候會建立一個定時任務,預設每隔一段時間(預設60s)將當前清單中,超時(預設為90s)沒有續約的服務剔除出去。 ### 1.2 服務續約 在註冊完服務之後,服務提供者會維護一個心跳用來持續告訴 Server: "我還活著"。以防止 Server 的”剔除任務“將該服務例項從服務列表中排除出去。我們稱該操作為服務續約(Renew)。 ## 0x02 DatumLeaseManager 在 Data Server 端,DatumLeaseManager 實現了 “失效剔除” 和 “服務續約 “功能。 ### 2.1 定義 DatumLeaseManager 的主要變數如下: - connectIdRenewTimestampMap 裡面會維護每個服務最近一次傳送心跳的時間,Eureka 裡面也有類似的資料結構; - locksForConnectId :為了每次只有一個執行緒操作;lock for connectId: every connectId allows only one task to be created; 具體定義如下: ```java public class DatumLeaseManager implements AfterWorkingProcess { /** record the latest heartbeat time for each connectId, format: connectId -> lastRenewTimestamp */ private f