阿里三面面試題:分散式服務註冊中心該如何選型?我快哭了....

  • 2019 年 10 月 6 日
  • 筆記

服務註冊中心,當前用得比較多的就是 Eureka 跟 Zookeeper 了。

Eureka 是 SpringCloud 自帶的組件,而 Zookeeper 則是 Dubbo 一般會選擇的。我們以前在做服務這塊其實是基於 Spring Cloud 技術棧來做的,沒有選擇Dubbo。所以,Eureka 也就作為了我們的服務註冊中心首選。

在選擇服務服務註冊中心之前,我們一般會選擇是基於 Spring Cloud 或者 Dubbo 來作為我們的微服務框架。選擇好以後那麼服務註冊中心,一般情況下Dubbo作為服務框架的,一般註冊中心會選擇zk, Spring Cloud作為服務框架的,一般服務註冊中心會選擇Eureka。

除了這些對比以外還有其他的一些對比,是我們不得不去了解的。

一、高可用

eureka 集群模式

Eureka 集群模式,是peer-to-peer的,集群裡面的每個機器的地位是相等的,不存在什麼主從什麼的說法。每個服務可以向任意一個Eureka 實例進行服務註冊和服務發現,集群裡面任意一個Eureka 實例接收到寫請求以後,會自動同步給其他所有的 Eureka 實例。

看圖一:

zookeeper

Zookeeper 服務註冊與發現的原理則是 Leader + Follower兩種角色。只有Leader 可以負責寫,也就是服務註冊,他可以把數據同步給所有的 Follower,讀的時候,也就是服務發現,是 Leader 和 Follower 都可以進行讀取。

看圖二:

二、在一致性保證方面

在分散式系統中,有一個非常出明的定理就是 CAP 定律了。這三者 Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區容錯性)在一個分散式系統中是不可兼得的。

要麼保證 CP 要麼保證 AP。之前寫過一篇分散式事物裡面解釋過為什麼在這兩種搭配裡面選擇,不過多闡述了。

Zookeeper 是有一個 Leader 節點會接收數據,然後同步寫到其他的 Follower 節點去。一旦 leader 掛掉,就要重新進行選舉新的 leader,在新選舉 leader 未完成前,集群是不可用的,當 leader 選擇好了,集群可以恢復繼續寫了,保證了數據的一致性,這個過程為了保證 C,犧牲了 A。

而 Eureka 是 peer 模式,可能數據還沒有同步完成,結果自己就宕了。此時還是可以繼續從別的機器上拉取註冊資訊,只是不是新的而以,這個過程服務可以向其他沒有宕機的節點進行註冊。

Eureka 保證了服務的可用性,當節點重新啟動起來以後,數據還是會同步過來,一致性方面就是 最終一致性,所以Eureka 保證了 A 犧牲了 C。

3、服務的時效性方面

Zookeeper 的時效性更好一些,註冊或者是服務掛了,一般秒級別就能感知到。

而 Eureka,默認的配置可能會有從幾十秒到分鐘級別。上線一個新的服務,到其他人發現他可能要一分鐘,還可能不止,因為Spring Cloud是通過 ribbon 去獲取每個服務快取的 Eureka 的註冊表進行負載均衡的。ribbon 本身還有自己的快取機制,還有自己的時間間隔。

當服務發生故障了,默認是隔 60秒採取檢查,發現這個服務上一次是在 60s 之前,Eureka 默認是超過 90秒才會任務它已經死掉了。這時候差不多已經過去 2分鐘了。

再則,Eureka 裡面默認是 30 秒才會把 ReadWrite 快取的數據同步到 ReadOnly 快取中,其他服務默認也是 30秒 才會去重新拉取一次 ReadOnly 快取到本地服務表中。這一趟下來算算時間還是很長的。

4、容量

zk 不太適合大規模的服務實例,因為服務上下線的時候需要瞬間推送數據通知到其他所有的實例,所以服務實例到幾千個的時候,可能會導致網路頻寬被打滿。

Eureka 也是同樣比較難支撐大規模的服務實例,因為它的每個節點都需要保存全量的實例數據,幾千實例服務可能會扛不住。

5、Eureka 服務發現慢的問題及調優

zk是因為一上線服務跟下線服務就會立馬發生數據同步,同時有服務進行節點的監聽,很快的時間內就可以感知到服務上線下線。所以基本上不需要怎麼去優化。

我們在前面的SpringCloud 底層原理文章中講過 Eureka 的運行機制。沒看過的同學,先去看看吧。

再結合到上面的Eureka時效性問題,我們可以發現對於 Eureka 來說,由於他的快取機制會導致服務會存在發現慢的問題。

我們可以針對下面的幾個點來優化:

  1. 優化服務發現時間;
  2. 優化定時從ReadWrite快取到 ReadOnly 快取的時間;
  3. 優化定時心跳檢查的時間;

針對項目的參數調整,給一個大概的配置:

這個參數的配置可能會由於SpringCloud 的版本不同,寫法也不同。

最後

讀到最後的朋友,感謝您的觀看,希望對您有所幫助!

同時希望能得到讀者們的關注和轉發,謝謝支援!

Tags: