国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

程序員筆記|詳解Eureka 緩存機制

mgckid / 840人閱讀

摘要:和二級緩存影響狀態更新,縮短這兩個定時任務周期可減少滯后時間,例如配置更新周期更新周期服務提供者保證服務正常下線。服務提供者延遲下線。

引言

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服務狀態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。

3.1 緩存機制

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

三級緩存

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

緩存相關配置

配置 默認 說明
eureka.server.useReadOnlyResponseCache true Client從readOnlyCacheMap更新數據,false則跳過readOnlyCacheMap直接從readWriteCacheMap更新
eureka.server.responsecCacheUpdateIntervalMs 30000 readWriteCacheMap更新至readOnlyCacheMap周期,默認30s
eureka.server.evictionIntervalTimerInMs 60000 清理未續約節點(evict)周期,默認60s
eureka.instance.leaseExpirationDurationInSeconds 90 清理未續約節點超時時間,默認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的服務。

二級緩存

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

緩存相關配置

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

關鍵類

類名 說明
com.netflix.discovery.DiscoveryClient Eureka Client 負責注冊、續約和更新,方法initScheduledTasks()分別初始化續約和更新定時任務
com.netflix.loadbalancer.PollingServerListUpdater Ribbon 更新使用的服務注冊信息,start初始化更新定時任務
com.netflix.loadbalancer.LoadBalancerStats Ribbon,保存使用且狀態為UP的服務注冊信息
五、默認配置下服務消費者最長感知時間
Eureka Client 時間 說明
上線 30(readOnly)+30(Client)+30(Ribbon)=90s readWrite -> 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時說明已經接受了其優先保證可用性(A)和分區容錯性(P)、不保證強一致性(C)的特點。如果需要優先保證強一致性(C),則應該考慮使用ZooKeeper等CP系統作為服務注冊中心。分布式系統中一般配置多節點,單個節點服務上線的狀態更新滯后并沒有什么影響,這里主要考慮服務下線后狀態更新滯后的應對措施。

6.1 Eureka Server

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

eureka.server.responsecCacheUpdateIntervalMs: 10000  # Eureka Server readOnlyCacheMap更新周期

2.關閉readOnlyCacheMap。中小型系統可以考慮該方案,Eureka Client直接從readWriteCacheMap更新服務注冊信息。

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

6.2 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保存了服務注冊信息,服務消費者通過網關將請求轉發給服務提供者,只需要做到服務提供者下線時通知網關在自己保存的服務列表中使該服務失效。為了保持網關的獨立性,可實現一個獨立服務接收下線通知并協調網關集群。下篇文章將詳細介紹網關如何實現服務下線實時感知,敬請期待!

作者:馮永彪
內容來源:宜信技術學院

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/62108.html

相關文章

  • SpringCloud微服務實戰筆記

    摘要:服務提供者的運行機制用了雙層結構來維護注冊的服務信息,第一層為服務的名稱,第二層為服務的實例名稱。服務注冊中心的運行機制為了防止服務的異常下線,會周期性的清理列表中未續約的服務。負載均衡器的基本功能維護該服務下的所有節點列表。 Spring Boot Spring Boot有什么作用 Spring Boot通過自動化的配置簡化Spring原有的樣板化的配置。 Spring Boo...

    chunquedong 評論0 收藏0
  • 2021 年最新基于 Spring Cloud 的微服務架構分析

    摘要:是一個相對比較新的微服務框架,年才推出的版本雖然時間最短但是相比等框架提供的全套的分布式系統解決方案。提供線程池不同的服務走不同的線程池,實現了不同服務調用的隔離,避免了服務器雪崩的問題。通過互相注冊的方式來進行消息同步和保證高可用。 Spring Cloud 是一個相對比較新的微服務框架,...

    cikenerd 評論0 收藏0
  • 墻裂推薦:搜云庫技術團隊,面試必備的技術干貨

    摘要:今天整理了一下近大半年以來的一些文章,和我的預期一樣,很多文章我都忘記自己曾經寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉發。 今天整理了一下近大半年以來的一些文章,和我的預期一樣,很多文章我都忘記自己曾經寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉發。 面試必備 面試必備:深入Spring MVC DispatchServlet 源碼...

    SegmentFault 評論0 收藏0
  • 墻裂推薦:搜云庫技術團隊,面試必備的技術干貨

    摘要:今天整理了一下近大半年以來的一些文章,和我的預期一樣,很多文章我都忘記自己曾經寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉發。 今天整理了一下近大半年以來的一些文章,和我的預期一樣,很多文章我都忘記自己曾經寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉發。 面試必備 面試必備:深入Spring MVC DispatchServlet 源碼...

    Neilyo 評論0 收藏0
  • 圖解 Eureka緩存架構 #yyds干貨盤點#

    摘要:圖解的緩存架構干貨盤點悟空聊架構默認會先從只讀緩存里面找。圖解的緩存架構干貨盤點緩存讀寫緩存過期的時候其實分兩種定時過期和實時過期。 大家好,我是悟空。先說下哈,這篇文章畫原理圖用了很多時間,求個三連!Eureka 注冊中心系列文章已經寫到第七篇了,這里匯總下:??領導讓我研究 Eureka 源碼 | 啟動過程????領導...

    番茄西紅柿 評論0 收藏2637

發表評論

0條評論

mgckid

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<