【雙11狂歡的背后】微服務注冊中心如何承載大型系統(tǒng)的千萬級訪問舵抹?

歡迎關注微信公眾號:石杉的架構筆記(id:shishan100

周一至周五早八點半矢赁!精品技術文章準時送上!

往期文章

1.拜托妹田!面試請不要再問我Spring Cloud底層原理!


目錄

一唬党、問題起源

二、Eureka Server設計精妙的注冊表存儲結(jié)構

三鬼佣、Eureka Server端優(yōu)秀的多級緩存機制

四驶拱、總結(jié)



一、問題起源

Spring Cloud架構體系中晶衷,Eureka是一個至關重要的組件蓝纲,它扮演著微服務注冊中心的角色,所有的服務注冊與服務發(fā)現(xiàn)晌纫,都是依賴Eureka的税迷。


不少初學Spring Cloud的朋友在落地公司生產(chǎn)環(huán)境部署時,經(jīng)常會問:

Eureka Server到底要部署幾臺機器锹漱?

我們的系統(tǒng)那么多服務箭养,到底會對Eureka Server產(chǎn)生多大的訪問壓力?

Eureka Server能不能抗住一個大型系統(tǒng)的訪問壓力凌蔬?


如果你也有這些疑問露懒,別著急闯冷!咱們這就一起去看看,Eureka作為微服務注冊中心的核心原理


下面這些問題懈词,大家先看看蛇耀,有個大概印象。帶著這些問題坎弯,來看后面的內(nèi)容纺涤,效果更佳

1、Eureka注冊中心使用什么樣的方式來儲存各個服務注冊時發(fā)送過來的機器地址和端口號抠忘?

2撩炊、各個服務找Eureka Server拉取注冊表的時候,是什么樣的頻率崎脉?

3拧咳、各個服務是如何拉取注冊表的?

4囚灼、一個幾百服務骆膝,部署上千臺機器的大型分布式系統(tǒng),會對Eureka Server造成多大的訪問壓力灶体?

5阅签、Eureka Server從技術層面是如何抗住日千萬級訪問量的?


先給大家說一個基本的知識點蝎抽,各個服務內(nèi)的Eureka Client組件政钟,默認情況下,每隔30秒會發(fā)送一個請求到Eureka Server樟结,來拉取最近有變化的服務信息


舉個例子

庫存服務原本部署在1臺機器上养交,現(xiàn)在擴容了,部署到了3臺機器瓢宦,并且均注冊到了Eureka Server上层坠。

然后訂單服務的Eureka Client會每隔30秒去找Eureka Server拉取最近注冊表的變化,看看其他服務的地址有沒有變化刁笙。


除此之外,Eureka還有一個心跳機制谦趣,各個Eureka Client每隔30秒會發(fā)送一次心跳到Eureka Server疲吸,通知人家說,哥們前鹅,我這個服務實例還活著摘悴!

如果某個Eureka Client很長時間沒有發(fā)送心跳給Eureka Server,那么就說明這個服務實例已經(jīng)掛了舰绘。

光看上面的文字蹂喻,大家可能沒什么印象葱椭。老規(guī)矩!咱們還是來一張圖口四,一起來直觀的感受一下這個過程孵运。



二、Eureka Server設計精妙的注冊表存儲結(jié)構

現(xiàn)在咱們假設你手頭有一套大型的分布式系統(tǒng)蔓彩,這套系統(tǒng)一共有100個服務治笨,每個服務部署在20臺機器上,機器是4核8G的標準配置赤嚼。

這相當于什么呢旷赖?也就是說相當于你一共部署了100 * 20 = 2000個服務實例,有2000臺機器更卒。

而每臺機器上的服務實例內(nèi)部都有一個Eureka Client組件等孵,這個Eureka Client組件每隔30秒會請求一次Eureka Server來拉取變化的注冊表。

此外蹂空,每個服務實例上的Eureka Client都會每隔30秒發(fā)送一次心跳請求給Eureka Server俯萌。

那么大家算算,Eureka Server作為一個微服務注冊中心腌闯,每秒鐘要被請求多少次绳瘟?一天要被請求多少次?

● 很簡單姿骏,我們就按最標準的算法來算糖声,即每個服務實例每分鐘請求2次拉取注冊表,每分鐘請求2次發(fā)送心跳

● 這樣的話分瘦,一個服務實例每分鐘會請求4次蘸泻,2000個服務實例每分鐘請求8000次

● 換算到每秒鐘,則是8000 / 60 = 133次左右嘲玫,我們直接可以大概估算為Eureka Server每秒鐘會被請求150次

● 所以悦施,一天的話,應該就是8000 * 60 * 24 = 1152萬去团,也就是每天千萬級訪問量


好抡诞!經(jīng)過這么一個測算,大家是否發(fā)現(xiàn)這里的奧秘了土陪?

● 首先第一點昼汗,對于微服務注冊中心這種組件,在一開始設計他這個注冊表的拉取頻率以及心跳發(fā)送頻率的時候鬼雀,就已經(jīng)考慮到了一個大型系統(tǒng)的各個服務請求時的壓力顷窒,每秒會承載多大的請求量。

● 所以說各個服務實例每隔30秒發(fā)起一次請求拉取變化的注冊表源哩,以及每隔30秒發(fā)送一次心跳給Eureka Server鞋吉,其實這個時間安排是有他的用意的鸦做。

按照我們的測算,一個上百個服務谓着,部署幾千臺機器的大規(guī)模系統(tǒng)泼诱,按照這樣的一個頻率請求Eureka Server,日請求量在千萬級漆魔,每秒的訪問量應該是固定在150次左右坷檩,即使算上其他的一些額外操作,算到每秒鐘請求Eureka Server在200次~300次吧改抡。

所以通過設置一個適中的拉取注冊表以及發(fā)送心跳的頻率矢炼,保證大規(guī)模系統(tǒng)里對Eureka Server的請求壓力不會太大。


那么關鍵問題來了阿纤,Eureka Server是如何保證輕松抗住這每秒數(shù)百次請求句灌,每天千萬級請求的呢?

要搞清楚這個欠拾,首先得清楚人家Eureka Server到底是用什么來存儲注冊表的胰锌?三個字,看源碼藐窄!

接下來咱們就一起進入Eureka的源碼里一探究竟:

● 如上圖所示资昧,圖中名為registryCocurrentHashMap,就是注冊表的核心結(jié)構荆忍「翊看完之后忍不住先贊嘆一下,精妙的設計刹枉!

● 從代碼中可以看到叽唱,Eureka Server的注冊表直接基于純內(nèi)存,就是在內(nèi)存里維護了一個數(shù)據(jù)結(jié)構微宝。

● 各個服務發(fā)起注冊棺亭、服務下線、服務故障蟋软,全部會在內(nèi)存里維護和更新這個注冊表镶摘。

● 各個服務每隔30秒拉取注冊表的時候,其實Eureka Server就是直接提供內(nèi)存里存儲的有變化的注冊表數(shù)據(jù)給他們就可以了岳守。

● 同樣钉稍,每隔30秒發(fā)起心跳的時候,也是在這個純內(nèi)存的CocurrentHashMap數(shù)據(jù)結(jié)構里更新心跳時間棺耍。


一句話概括:維護注冊表、拉取注冊表种樱、更新心跳時間蒙袍,全部發(fā)生在內(nèi)存里俊卤!這就是Eureka Server非常核心的一個點。


搞清楚了這一點害幅,咱們再來分析一下這個叫做registry的東西的數(shù)據(jù)結(jié)構消恍,大家千萬別被它復雜的外表唬住了,沉下心來以现,一層層的分析狠怨!

● 首先,這個ConcurrentHashMap的key就是服務名稱邑遏,比如說“inventory-service”佣赖,就是一個服務名稱。

● 而value則代表了一個服務的多個服務實例记盒。

● 舉個例子:比如說“inventory-service”是可以有3個服務實例的憎蛤,每個服務實例部署在一臺機器上


接下來咱們再來看里面這個小Map:Map<String, Lease<InstanceInfo>

● 這個Map的key就是服務實例的id

● value是一個叫做Lease<InstanceInfo>的東西。這又是什么鬼呢纪吮?

■? 首先說下InstanceInfo俩檬,其實啊,我們見名知義碾盟,這個InstanceInfo就代表了服務實例的具體信息棚辽,比如機器的ip地址、hostname以及端口號

■ 而Lease的這個Lease冰肴,里面則會維護每個服務最近一次發(fā)送心跳的時間



三屈藐、Eureka Server端優(yōu)秀的多級緩存機制

假設Eureka Server部署在4核8G的普通機器上,那么基于內(nèi)存來承載各個服務的請求嚼沿,每秒鐘最多可以處理多少請求呢估盘?

● 根據(jù)之前做過的測試,單臺4核8G的機器骡尽,處理一些純內(nèi)存的操作遣妥,哪怕加上一些網(wǎng)絡請求的開銷,每秒處理幾百請求是很輕松的攀细。哪怕是更大規(guī)模的機器和請求量箫踩,處理起來察迟,也是輕松加愉快鸟缕。

● 而且Eureka Server為了避免同時讀寫內(nèi)存數(shù)據(jù)結(jié)構造成的并發(fā)沖突問題菌仁,還采用了多級緩存機制來進一步提升服務請求的響應速度瞧掺。

● 在拉取注冊表的時候:

? ? ? ? 首先從ReadOnlyCacheMap里查緩存的注冊表淆储。

????????如果沒有雾消,就找ReadWriteCacheMap里緩存的注冊表友驮。

? ? ? ? 如果還沒有嫂沉,就從內(nèi)存中獲取實際的注冊表數(shù)據(jù)。

● 在注冊表發(fā)生變更的時候:

? ? ? ? ?會在內(nèi)存中更新變更的注冊表數(shù)據(jù)缚态,同時過期掉ReadWriteCacheMap磁椒。

? ? ? ? ?這個過程不會影響ReadOnlyCacheMap提供人家查詢注冊表。

? ? ? ? ?在一段時間內(nèi)玫芦,默認是30秒浆熔,各個服務拉取注冊表數(shù)據(jù)都會直接讀ReadOnlyCacheMap。

? ? ? ? ?30秒過后桥帆,Eureka Server的后臺線程發(fā)現(xiàn)ReadWriteCacheMap已經(jīng)清空了医增,那么也會清空ReadOnlyCacheMap中的緩存

? ? ? ? ?下次有服務拉取注冊表,又會從內(nèi)存中獲取最新的數(shù)據(jù)了老虫,同時填充各個緩存叶骨。


多級緩存機制的優(yōu)點是什么?

1.這種多級緩存機制的設計张遭,盡可能保證了內(nèi)存注冊表數(shù)據(jù)不會出現(xiàn)頻繁的讀寫沖突問題邓萨。

2.并且進一步保證對Eureka Server的大量請求,都是快速從純內(nèi)存走菊卷,性能極高缔恳。


為方便大家更好的理解,同樣來一張圖洁闰,大家跟著圖再來回顧一下這整個過程:


四歉甚、總結(jié)

● 通過上面的分析可以看到,Eureka通過設置適當?shù)恼埱箢l率(拉取注冊表30秒間隔扑眉,發(fā)送心跳30秒間隔)纸泄,可以保證一個大規(guī)模的系統(tǒng)每秒請求Eureka Server的次數(shù)在幾百次。

● 同時還通過純內(nèi)存的注冊表腰素,保證了所有的請求都可以在內(nèi)存處理聘裁,這樣確保了極高的性能,普通機器一秒鐘處理幾百請求都是輕松+愉快的弓千。

● 另外還有多級緩存機制衡便,確保說不會針對內(nèi)存數(shù)據(jù)結(jié)構發(fā)生頻繁的讀寫并發(fā)沖突操作,進一步提升性能洋访。


上述就是Spring Cloud架構中镣陕,Eureka作為微服務注冊中心可以承載大規(guī)模系統(tǒng)每天千萬級訪問量的原理。


如有收獲姻政,請幫忙轉(zhuǎn)發(fā)呆抑,您的鼓勵是作者最大的動力,謝謝汁展!


一大波微服務鹊碍、分布式厌殉、高并發(fā)、高可用原創(chuàng)系列文章正在路上侈咕,歡迎掃描下方二維碼年枕,持續(xù)關注:

《雙11每秒上萬并發(fā)下的Spring Cloud參數(shù)優(yōu)化實戰(zhàn)》,敬請期待

《微服務架構如何保障雙11狂歡下的99.99%高可用》乎完,敬請期待

石杉的架構筆記(id:shishan100)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 歡迎關注微信公眾號石杉的架構筆記(id:shishan100)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?周一至周五早八點半!精品技術文章準時送上品洛!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 十余年BAT架構經(jīng)驗傾囊相授树姨。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市桥状,隨后出現(xiàn)的幾起案子帽揪,更是在濱河造成了極大的恐慌,老刑警劉巖辅斟,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件转晰,死亡現(xiàn)場離奇詭異,居然都是意外死亡士飒,警方通過查閱死者的電腦和手機查邢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酵幕,“玉大人扰藕,你說我怎么就攤上這事》既觯” “怎么了邓深?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長笔刹。 經(jīng)常有香客問我芥备,道長,這世上最難降的妖魔是什么舌菜? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任萌壳,我火速辦了婚禮,結(jié)果婚禮上酷师,老公的妹妹穿的比我還像新娘讶凉。我一直安慰自己,他們只是感情好山孔,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布懂讯。 她就那樣靜靜地躺著,像睡著了一般台颠。 火紅的嫁衣襯著肌膚如雪褐望。 梳的紋絲不亂的頭發(fā)上勒庄,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音瘫里,去河邊找鬼实蔽。 笑死,一個胖子當著我的面吹牛谨读,可吹牛的內(nèi)容都是我干的局装。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼劳殖,長吁一口氣:“原來是場噩夢啊……” “哼铐尚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哆姻,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宣增,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矛缨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爹脾,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年箕昭,在試婚紗的時候發(fā)現(xiàn)自己被綠了灵妨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡盟广,死狀恐怖闷串,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情筋量,我是刑警寧澤烹吵,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站桨武,受9級特大地震影響肋拔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呀酸,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一凉蜂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧性誉,春花似錦窿吩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至倾哺,卻和暖如春轧邪,著一層夾襖步出監(jiān)牢的瞬間刽脖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工忌愚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留曲管,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓硕糊,卻偏偏與公主長得像院水,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子简十,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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