springcloud項目優雅重啓(四):總體緩存時間

從入口按順序:緩存

  • Ribbon:從eureka-client獲取服務對應的節點列表,存儲在本地緩存;經過定時任務,定時刷新緩存數據,定時任務默認30秒執行一次。
  • Eureka-Client:spa

    • 啓動以後會啓動定時任務,定時從eureka-server獲取服務列表,存入本地緩存,定時任務默認30秒執行一次。
    • 第一次會調用全量接口獲取全部服務。
    • 後續會調用增量接口,增量獲取有變更的服務,根據變更信息修改緩存數據;同時根據接口返回的code跟本地生成的code作比較,若是不一致,就調用全量接口從新獲取全部服務。
    • 定時續租/renew,默認30秒一次。
  • Eureka-Server:code

    • 緩存:共三級緩存,能夠經過配置關閉第一級緩存,默認是開啓。server

      1. 一級緩存readOnlyCacheMap:經過定時任務,定時從二級緩存中獲取數據並刷新當前值,定時任務默認30秒執行一次。
      2. 二級緩存readWriteCacheMap:經過guava cache實現緩存機制,默認是從寫入時間起算,30秒以後過時;服務信息有變更時,會實時修改二級緩存數據(其實是清理掉緩存,下次讀取數據時,會從下一級獲取數據並存儲緩存)。
      3. 三級存儲registry:從不一樣維度存儲服務信息(好比ALL_APPS存儲全部服務列表,ALL_APPS_DELTA存儲最新變動列表,服務名存儲服務對應的信息列表);服務信息有變更時,會實時修改數據。
    • 下線:定時任務定時清理長時間未續租/renew的節點。blog

      1. 定時任務默認每60秒執行一次。
      2. 清理掉超過90秒(實際上還會算上任務執行的補償時間)未續租/renew的節點。
      3. 單次最多清理掉25%的節點。

總體流程以下:
a2b1739e-e1de-46f5-82fc-baa1391b1070.png接口

相關配置:
Ribbon:進程

配置參數 默認(秒) 說明
ribbon.ServerListRefreshInterval 30 本地服務列表緩存更新週期

Euraka-Client:get

配置參數 默認(秒) 說明
eureka.client.registryFetchIntervalSeconds 30 本地服務列表緩存更新週期,(正常狀況下增量更新,第一次或與 Server 端不一致等狀況則全量更新)
eureka.instance.leaseRenewalIntervalInSeconds 30 續約週期

Euraka-Server:it

配置參數 默認(秒) 說明
eureka.server.useReadOnlyResponseCache true 是否開啓readOnlyCacheMap緩存
eureka.server.responsecCacheUpdateIntervalMs 30 readOnlyCacheMap緩存更新週期
eureka.server.evictionIntervalTimerInMs 60 清理/下線長時間未續租節點週期
eureka.instance.leaseExpirationDurationInSeconds 90 未續租節點超時時間,超過這個時間,就會被清理任務清理掉

默認配置下服務消費者最長感知時間:io

Eureka-Client 時間(秒) 說明
上線 30(readOnly)+30(Client)+30(Ribbon)=90 readWrite -> readOnly -> Client -> Ribbon 各 30s
正常下線 30(readonly)+30(Client)+30(Ribbon)=90 服務正常下線(kill 或 kill -15 殺死進程)會給進程善後機會,<br/>DiscoveryClient.shutdown() 將向 Server 更新自身狀態爲 DOWN,<br/>而後發送 DELETE 請求註銷本身,registry 和 readWriteCacheMap 實時更新,故 UI 將再也不顯示該服務實例
非正常下線 60+90+30+30+30=240 服務非正常下線(kill -9 殺死進程或進程崩潰)不會觸發 DiscoveryClient.shutdown() 方法,<br/>Eureka Server 將依賴每 60s 清理超過 90s 未續約服務從 registry 和 readWriteCacheMap 中刪除該服務實例

考慮以下狀況:

  • 0s 時服務未通知 Eureka Client 直接下線;
  • 29s 時第一次過時檢查 evict 未超過 90s;
  • 89s 時第二次過時檢查 evict 未超過 90s;
  • 149s 時第三次過時檢查 evict 未續約時間超過了 90s,故將該服務實例從 registry 和 readWriteCacheMap 中刪除;
  • 179s 時定時任務從 readWriteCacheMap 更新至 readOnlyCacheMap;
  • 209s 時 Eureka Client 從 Eureka Server 的 readOnlyCacheMap 更新;
  • 239s 時 Ribbon 從 Eureka Client 更新。

20560c30-170b-4db7-85ae-72e21241ccad.png

因爲eureka-server分批下線機制(最多25%),若是同時有大批量節點下線的話(超過25%,未達到自我保護機制閾值,或者未開啓自我保護機制),有的服務節點還會超過240秒。

參考:
詳解Eureka緩存機制
相關文章
相關標籤/搜索