亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解析Eureka 緩存機制

發布時間:2021-11-23 18:01:20 來源:億速云 閱讀:146 作者:柒染 欄目:軟件技術

今天就跟大家聊聊有關如何解析Eureka 緩存機制,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

引言

Eureka是Netflix開源的、用于實現服務注冊和發現的服務。Spring Cloud Eureka基于Eureka進行二次封裝,增加了更人性化的UI,使用更為方便。但是由于Eureka本身存在較多緩存,服務狀態更新滯后,最常見的狀況是:服務下線后狀態沒有及時更新,服務消費者調用到已下線的服務導致請求失敗。基于Spring Cloud Eureka 1.4.4.RELEASE,在默認region和zone的前提下,介紹Eureka的緩存機制。

AP特性

從CAP理論看,Eureka是一個AP系統,優先保證可用性(A)和分區容錯性(P),不保證強一致性(C),只保證最終一致性,因此在架構中設計了較多緩存。

如何解析Eureka 緩存機制如何解析Eureka 緩存機制如何解析Eureka 緩存機制

(Eureka高可用架構)

服務狀態

Eureka服務狀態enum類:com.netflix.appinfo.InstanceInfo.InstanceStatus

狀態說明狀態說明
UP在線OUT_OF_SERVICE失效
DOWN下線UNKNOWN未知
STARTING正在啟動

Eureka Server

在Eureka高可用架構中,Eureka Server也可以作為Client向其他server注冊,多節點相互注冊組成Eureka集群,集群間相互視為peer。Eureka Client向Server注冊、續約、更新狀態時,接受節點更新自己的服務注冊信息后,逐個同步至其他peer節點。

【注意】如果server-A向server-B節點單向注冊,則server-A視server-B為peer節點,server-A接受的數據會同步給server-B,但server-B接受的數據不會同步給server-A。

緩存機制

Eureka Server存在三個變量:(registry、readWriteCacheMap、readOnlyCacheMap)保存服務注冊信息,默認情況下定時任務每30s將readWriteCacheMap同步至readOnlyCacheMap,每60s清理超過90s未續約的節點,Eureka Client每30s從readOnlyCacheMap更新服務注冊信息,而UI則從registry更新服務注冊信息。

如何解析Eureka 緩存機制如何解析Eureka 緩存機制

三級緩存

緩存類型說明
registryConcurrentHashMap實時更新,類AbstractInstanceRegistry成員變量,UI端請求的是這里的服務注冊信息
readWriteCacheMapGuava Cache/LoadingCache實時更新,類ResponseCacheImpl成員變量,緩存時間180秒
readOnlyCacheMapConcurrentHashMap周期更新,類ResponseCacheImpl成員變量,默認每30s從readWriteCacheMap更新,Eureka client默認從這里更新服務注冊信息,可配置直接從readWriteCacheMap更新

緩存相關配置

配置默認說明
eureka.server.useReadOnlyResponseCachetrueClient從readOnlyCacheMap更新數據,false則跳過readOnlyCacheMap直接從readWriteCacheMap更新
eureka.server.responsecCacheUpdateIntervalMs30000readWriteCacheMap更新至readOnlyCacheMap周期,默認30s
eureka.server.evictionIntervalTimerInMs60000清理未續約節點(evict)周期,默認60s
eureka.instance.leaseExpirationDurationInSeconds90清理未續約節點超時時間,默認90s

關鍵類

類名說明
com.netflix.eureka.registry.AbstractInstanceRegistry保存服務注冊信息,持有registry和responseCache成員變量
com.netflix.eureka.registry.ResponseCacheImpl持有readWriteCacheMap和readOnlyCacheMap成員變量

Eureka Client

Eureka Client存在兩種角色:服務提供者服務消費者,作為服務消費者一般配合Ribbon或Feign(Feign內部使用Ribbon)使用。Eureka Client啟動后,作為服務提供者立即向Server注冊,默認情況下每30s續約(renew);作為服務消費者立即向Server全量更新服務注冊信息,默認情況下每30s增量更新服務注冊信息;Ribbon延時1s向Client獲取使用的服務注冊信息,默認每30s更新使用的服務注冊信息,只保存狀態為UP的服務。

二級緩存

緩存類型說明
localRegionAppsAtomicReference周期更新,類DiscoveryClient成員變量,Eureka Client保存服務注冊信息,啟動后立即向Server全量更新,默認每30s增量更新
upServerListZoneMapConcurrentHashMap周期更新,類LoadBalancerStats成員變量,Ribbon保存使用且狀態為UP的服務注冊信息,啟動后延時1s向Client更新,默認每30s更新

緩存相關配置

配置默認說明
eureka.instance.leaseRenewalIntervalInSeconds30Eureka Client 續約周期,默認30s
eureka.client.registryFetchIntervalSeconds30Eureka Client 增量更新周期,默認30s(正常情況下增量更新,超時或與Server端不一致等情況則全量更新)
ribbon.ServerListRefreshInterval30000Ribbon 更新周期,默認30s

關鍵類

類名說明
com.netflix.discovery.DiscoveryClientEureka Client 負責注冊、續約和更新,方法initScheduledTasks()分別初始化續約和更新定時任務
com.netflix.loadbalancer.PollingServerListUpdaterRibbon 更新使用的服務注冊信息,start初始化更新定時任務
com.netflix.loadbalancer.LoadBalancerStatsRibbon,保存使用且狀態為UP的服務注冊信息

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

Eureka Client時間說明
上線30(readOnly)+30(Client)+30(Ribbon)=90sreadWrite -> readOnly -> Client -> Ribbon 各30s
正常下線30(readonly)+30(Client)+30(Ribbon)=90s服務正常下線(kill或kill -15殺死進程)會給進程善后機會,DiscoveryClient.shutdown()將向Server更新自身狀態為DOWN,然后發送DELETE請求注銷自己,registry和readWriteCacheMap實時更新,故UI將不再顯示該服務實例
非正常下線30+60(evict)*2+30+30+30= 240s服務非正常下線(kill -9殺死進程或進程崩潰)不會觸發DiscoveryClient.shutdown()方法,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更新。

因此,極限情況下服務消費者最長感知時間將無限趨近240s。

如何解析Eureka 緩存機制如何解析Eureka 緩存機制

應對措施

服務注冊中心在選擇使用Eureka時說明已經接受了其優先保證可用性(A)和分區容錯性(P)、不保證強一致性(C)的特點。如果需要優先保證強一致性(C),則應該考慮使用ZooKeeper等CP系統作為服務注冊中心。分布式系統中一般配置多節點,單個節點服務上線的狀態更新滯后并沒有什么影響,這里主要考慮服務下線后狀態更新滯后的應對措施。

Eureka Server

  • 1.縮短readOnlyCacheMap更新周期。縮短該定時任務周期可減少滯后時間。

    eureka.server.responsecCacheUpdateIntervalMs: 10000  # Eureka Server readOnlyCacheMap更新周期
  • 2.關閉readOnlyCacheMap。中小型系統可以考慮該方案,Eureka Client直接從readWriteCacheMap更新服務注冊信息。

    eureka.server.useReadOnlyResponseCache: false        # 是否使用readOnlyCacheMap

Eureka Client

  • 1.服務消費者使用容錯機制。如Spring Cloud Retry和Hystrix,Ribbon、Feign、Zuul都可以配置Retry,服務消費者訪問某個已下線節點時一般報ConnectTimeout,這時可以通過Retry機制重試下一個節點。

  • 2.服務消費者縮短更新周期。Eureka Client和Ribbon二級緩存影響狀態更新,縮短這兩個定時任務周期可減少滯后時間,例如配置:

    eureka.client.registryFetchIntervalSeconds: 5        # Eureka Client更新周期
    ribbon.ServerListRefreshInterval: 2000               # Ribbon更新周期
  • 3.服務提供者保證服務正常下線。服務下線時使用kill或kill -15命令,避免使用kill -9命令,kill或kill -15命令殺死進程時將觸發Eureka Client的shutdown()方法,主動刪除Server的registry和readWriteCacheMap中的注冊信息,不必依賴Server的evict清除。

  • 4.服務提供者延遲下線。服務下線之前先調用接口使Eureka Server中保存的服務狀態為DOWN或OUT_OF_SERVICE后再下線,二者時間差根據緩存機制和配置決定,比如默認情況下調用接口后延遲90s再下線服務即可保證服務消費者不會調用已下線服務實例。

網關實現服務下線實時感知

在軟件工程中,沒有一個問題是中間層解決不了的,而網關是服務提供者和服務消費者的中間層。以Spring Cloud Zuul網關為例,網關作為Eureka Client保存了服務注冊信息,服務消費者通過網關將請求轉發給服務提供者,只需要做到服務提供者下線時通知網關在自己保存的服務列表中使該服務失效。為了保持網關的獨立性,可實現一個獨立服務接收下線通知并協調網關集群。

看完上述內容,你們對如何解析Eureka 緩存機制有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

砀山县| 怀柔区| 康平县| 石渠县| 深圳市| 扎鲁特旗| 张掖市| 鲁甸县| 惠安县| 石河子市| 休宁县| 兴义市| 门源| 贵阳市| 怀安县| 惠安县| 咸丰县| 商丘市| 沐川县| 嘉黎县| 德令哈市| 略阳县| 晴隆县| 衡阳市| 汝城县| 屏山县| 东阿县| 通辽市| 保定市| 城口县| 屏南县| 临汾市| 渭源县| 桐城市| 苗栗市| 桂阳县| 金华市| 岳池县| 科技| 永定县| 仁布县|