eureka緩存細(xì)節(jié)以及生產(chǎn)環(huán)境的最佳配置

eureka作為spring cloud微服務(wù)架構(gòu)里的注冊(cè)中心阳懂,是非常核心的一個(gè)組件宙暇。它本身的架構(gòu)避免了復(fù)雜的選主算法,比較簡(jiǎn)單刮萌,搭個(gè)demo也確實(shí)很快,但是如果要用于生產(chǎn)環(huán)境娘扩,還是得注意很多東西着茸,尤其是下線延遲...

一、服務(wù)獲取中的緩存問題

第一節(jié)的內(nèi)容都是從這個(gè)issue翻譯的:Documentation: changing Eureka renewal frequency WILL break the self-preservation feature of the server

1.1 為什么修改client的默認(rèn)心跳時(shí)間琐旁,會(huì)導(dǎo)致自我保護(hù)模式失效涮阔?

Eureka Service會(huì)認(rèn)為客戶端是以30s的頻率來發(fā)送心跳的。服務(wù)端期望收到的最大心跳時(shí)間是:

n instances x 2(60s/30s) x threshold

如果是2個(gè)實(shí)例灰殴,Eureka會(huì)期望每分鐘有:2 instances x 2 x 85% =3.4個(gè)心跳,也就是說需要3個(gè)心跳敬特。
如果client的心跳改成15s,掛掉一個(gè)牺陶,另一個(gè)在1min內(nèi)會(huì)發(fā)出4個(gè)心跳伟阔,而這時(shí)候的閾值還是3.4個(gè),自我保護(hù)模式就失效了掰伸。
核心原因就是在Eureka Server計(jì)算期望心跳數(shù)的時(shí)候?qū)懰懒嗣糠昼姷男奶g隔皱炉,即30秒,所以他永遠(yuǎn)會(huì)是*2(感覺像是新手寫的代碼啊啊啊 -_-)

image

還有一個(gè)參數(shù)可以調(diào)整狮鸭,eureka.server.renewalThresholdUpdateIntervalMs合搅,心跳閾值重新計(jì)算的周期多搀,默認(rèn)15分鐘,可以改短一點(diǎn)灾部,2min

1.2 客戶端首次注冊(cè)時(shí)間為什么要30s康铭?如何改進(jìn)?

首次注冊(cè)行為是和首次心跳綁定在一起的赌髓,首次心跳發(fā)送以后會(huì)收到not found的響應(yīng),client就知道還沒注冊(cè)過从藤,client就會(huì)馬上注冊(cè)。首次心跳由參數(shù)

eureka.instance.leaseRenewalIntervalInSeconds控制的春弥,默認(rèn)30

可以通過eureka.client.initialInstanceInfoReplicationIntervalSeconds參數(shù)來加快首次注冊(cè)的速度呛哟。他是控制首次改變實(shí)例狀態(tài)(UP/DOWN )的時(shí)間,啟動(dòng)的時(shí)候狀態(tài)肯定是需要改變的匿沛,所以他可以用來加快首次注冊(cè)速度扫责,并且改變這個(gè)值不會(huì)影響到保護(hù)模式

另外如果你使用的是spring cloud eureka的話沒首次注冊(cè)延遲的問題,他會(huì)馬上注冊(cè)

1.3 其他影響快速獲取服務(wù)信息的因素

【服務(wù)端緩存】
因?yàn)榉?wù)端默認(rèn)會(huì)有個(gè)read only response cache(下面會(huì)細(xì)說)逃呼,每30秒更新一次(eureka.server.response-cache-update-interval-ms),所以可能注冊(cè)了不是馬上能看到(雖然通過rest api不能看到鳖孤,但是你可以在web ui上看到,因?yàn)閡i沒有緩存)

【客戶端緩存】
Eureka Client緩存的定期更新周期抡笼,他由eureka.client.registryFetchIntervalSeconds控制苏揣,默認(rèn)30秒, 改成5秒

【Ribbon緩存】
如果你采用Ribbon來訪問服務(wù)推姻,那么這里會(huì)有個(gè)緩存(他的數(shù)據(jù)來源是本地Eureka Client緩存)平匈,他由ribbon. ServerListRefreshInterval控制,默認(rèn)30秒藏古, 改成2秒

1.4 怎么更快的踢掉沒有心跳的機(jī)器

eureka.instance.leaseExpirationDurationInSeconds增炭,這個(gè)值用來控制多久踢掉機(jī)器,默認(rèn)是3個(gè)心跳周期拧晕,有點(diǎn)久隙姿,可以考慮改成2個(gè),他不會(huì)影響到保護(hù)模式(如果開啟自我保護(hù)模式厂捞,心跳間隔因?yàn)?.1的bug不能改输玷,只能改這個(gè)了 -_-)


二、服務(wù)端緩存細(xì)節(jié)

Eureka內(nèi)部的緩存分很多級(jí)靡馁,主要有registry欲鹏、readWriterCacheMap、readOnlyCacheMap臭墨;另外還有一個(gè)維護(hù)最近180s增量的隊(duì)列recentlyChangedQueue

2.1 寫操作

包括注冊(cè)貌虾、取消注冊(cè)等,都直接操作在registry上裙犹,同時(shí)也會(huì)更新recentlyChangedQueue和readWriterCacheMap

2.2 讀操作

讀默認(rèn)是從readOnlyCacheMap讀取尽狠,讀不到的話再?gòu)膔eadWriterCacheMap,還是沒有再?gòu)膔egistry

2.3 濫用緩存的讀操作

這個(gè)讀操作的三級(jí)緩存結(jié)構(gòu)叶圃,非常讓人困惑袄膏,registry已經(jīng)是ConcurrentHashMap,純內(nèi)存操作掺冠,性能非常高了沉馆,為什么前面還要加兩級(jí)緩存;readWriterCacheMap的數(shù)據(jù)是在寫入以后responseCacheAutoExpirationInSeconds(默認(rèn)180)秒內(nèi)失效德崭,readOnlyCacheMap則是一個(gè)定時(shí)任務(wù)斥黑,每responseCacheUpdateIntervalMs(默認(rèn)30)秒從readWriterCacheMap獲取最新數(shù)據(jù)

2.4 去掉readOnlyCacheMap

從CAP理論上看,Eureka是一個(gè)AP系統(tǒng)眉厨,但是在C層面這么弱锌奴,就是因?yàn)楦鞣N無謂的緩存造成的,看了下readWriterCacheMap去掉比較難憾股,但是readOnlyCacheMap有一個(gè)開關(guān)useReadOnlyResponseCache鹿蜀,果斷關(guān)掉!服球!


三茴恰、Time Lag

最后再來看下Eureka wiki中提到的2min time lag問題,其實(shí)分多個(gè)角度看斩熊,不一定是2min

3.1 服務(wù)正常上線/修改往枣,最大可能會(huì)有120s滯后

1.直接使用Eureka:30(首次注冊(cè) init registe) + 30(readOnlyCacheMap)+30(client fetch interval)+30(ribbon cache)=120
2.在Spring Cloud環(huán)境下使用這些組件(Eureka, Ribbon):不會(huì)有首次注冊(cè)30秒延遲的問題,服務(wù)啟動(dòng)后會(huì)馬上注冊(cè),所以從注冊(cè)到發(fā)現(xiàn)粉渠,最多可能是90s分冈。

服務(wù)異常下線:最大可能會(huì)有270s滯后

1.定時(shí)清理任務(wù)每eureka.server. evictionIntervalTimerInMs(默認(rèn)60)執(zhí)行一次清理任務(wù)
2.每次清理任務(wù)會(huì)把90秒(3個(gè)心跳周期,eureka.instance.leaseExpirationDurationInSeconds)沒收到心跳的踢除渣叛,但是根據(jù)官方的說法 丈秩,因?yàn)榇a實(shí)現(xiàn)的bug,這個(gè)時(shí)間其實(shí)是兩倍淳衙,即180秒蘑秽,也就是說如果一個(gè)客戶端因?yàn)榫W(wǎng)絡(luò)問題或者主機(jī)問題異常下線,可能會(huì)在180秒后才剔除
3.讀取端箫攀,因?yàn)閞eadOnlyCacheMap以及客戶端緩存的存在肠牲,可能會(huì)在30(readOnlyCacheMap)+30(client fetch interval)+30(ribbon)=90

  1. 所以極端情況最終可能會(huì)是180+90=270

四、生產(chǎn)環(huán)境最佳配置

總結(jié)前面3點(diǎn)靴跛,經(jīng)過梳理后缀雳,推薦的生產(chǎn)環(huán)境最佳配置如下:(可用于中小規(guī)模環(huán)境):

Eureka Server端配置

## 中小規(guī)模下,自我保護(hù)模式坑比好處多梢睛,所以關(guān)閉它
eureka.server.enableSelfPreservation=false
## 心跳閾值計(jì)算周期肥印,如果開啟自我保護(hù)模式识椰,可以改一下這個(gè)配置
## eureka.server.renewalThresholdUpdateIntervalMs=120000

## 主動(dòng)失效檢測(cè)間隔,配置成5秒
eureka.server.evictionIntervalTimerInMs=5000

## 心跳間隔,5秒
eureka.instance.leaseRenewalIntervalInSeconds=5
## 沒有心跳的淘汰時(shí)間深碱,10秒
eureka.instance.leaseExpirationDurationInSeconds=10

## 禁用readOnlyCacheMap
eureka.server. useReadOnlyResponseCache=false

服務(wù)提供者和clinet配置

## 心跳間隔腹鹉,5秒
eureka.instance.leaseRenewalIntervalInSeconds=5
## 沒有心跳的淘汰時(shí)間,10秒
eureka.instance.leaseExpirationDurationInSeconds=10

# 定時(shí)刷新本地緩存時(shí)間
eureka.client.registryFetchIntervalSeconds=5
# ribbon緩存時(shí)間
ribbon.ServerListRefreshInterval=2000

改成上面配置后:

  • 正常上線下線客戶端最大感知時(shí)間:eureka.client.registryFetchIntervalSeconds+ribbon. ServerListRefreshInterval = 7秒

  • 異常下線客戶端最大感知時(shí)間:
    2*eureka.instance.leaseExpirationDurationInSeconds+
    eureka.server.evictionIntervalTimerInMs+
    eureka.client.registryFetchIntervalSeconds+
    ribbon. ServerListRefreshInterval = 32

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敷硅,一起剝皮案震驚了整個(gè)濱河市功咒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绞蹦,老刑警劉巖力奋,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異幽七,居然都是意外死亡景殷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門锉走,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滨彻,“玉大人,你說我怎么就攤上這事挪蹭⊥ざ” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵梁厉,是天一觀的道長(zhǎng)辜羊。 經(jīng)常有香客問我,道長(zhǎng)词顾,這世上最難降的妖魔是什么八秃? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮肉盹,結(jié)果婚禮上昔驱,老公的妹妹穿的比我還像新娘。我一直安慰自己上忍,他們只是感情好骤肛,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著窍蓝,像睡著了一般腋颠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吓笙,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天淑玫,我揣著相機(jī)與錄音,去河邊找鬼。 笑死絮蒿,一個(gè)胖子當(dāng)著我的面吹牛尊搬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播土涝,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼毁嗦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了回铛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤克锣,失蹤者是張志新(化名)和其女友劉穎茵肃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袭祟,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡验残,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巾乳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片您没。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胆绊,靈堂內(nèi)的尸體忽然破棺而出氨鹏,到底是詐尸還是另有隱情,我是刑警寧澤压状,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布仆抵,位于F島的核電站,受9級(jí)特大地震影響种冬,放射性物質(zhì)發(fā)生泄漏镣丑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一娱两、第九天 我趴在偏房一處隱蔽的房頂上張望莺匠。 院中可真熱鬧,春花似錦十兢、人聲如沸趣竣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽期贫。三九已至,卻和暖如春异袄,著一層夾襖步出監(jiān)牢的瞬間通砍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留封孙,地道東北人迹冤。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像虎忌,于是被迫代替她去往敵國(guó)和親泡徙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容