《RPC實戰與核心原理》學習筆記Day7

来源:https://www.cnblogs.com/wing011203/archive/2023/01/24/17065822.html
-Advertisement-
Play Games

這篇文章主要關註服務發現,會討論基於DNS、VIP、ZooKeeper以及消息匯流排的服務發現機制,研究出在服務發現需要AP還是CP。 ...


08 | 服務發現:到底是要CP還是AP?

我們為什麼需要“服務發現”?

從高可用的角度出發,在生產環境中,服務提供方通常會以集群的方式對外提供服務,集群中的IP地址隨時可能發生變化,因此我們需要一本“通訊錄”來及時獲取對應的服務節點信息,維護“通訊錄”以及或者節點信息的過程,我們稱之為“服務發現”。

服務發現包括2個核心模塊:

  • 服務註冊:在服務提供方啟動的時候,將對外暴露的介面註冊到註冊中心中,註冊中心將這個服務節點的IP和介面保存下來。
  • 服務訂閱:在服務調用方啟動的時候,去註冊中心查找並訂閱服務提供方的IP,然後緩存到本地,並用於後續遠程調用。

我們為什麼不採用基於DNS的服務發現機制?

我們來看一下DNS查詢流程。

它存在的兩個主要問題:

  1. 如果服務節點的IP埠下線了,服務調用者能否及時摘除服務節點?
  2. 如果之前已經上線了一部分服務節點,這時突然對這個服務進行擴容,那麼新上線的服務節點能否及時接收到流程呢?

為什麼VIP方案也不能用於服務發現?

VIP方案如下所示。

它主要有以下幾個問題:

  1. 搭建負載均衡設備或者TCP/IP四層代理,需要額外成本。
  2. 請求流程都經過負載均衡設備,多經過一次網路傳輸,會額外浪費性能。
  3. 負載均衡添加節點和摘除節點,一般都需要手動添加,當大批量擴容和下線時,會有大量的人工操作和生效延遲。
  4. 不能支持更靈活的負載均衡策略。

基於ZooKeeper的服務發現機制的工作流程是怎樣的?

基於ZooKeeper的服務發現結構圖如下。

它的工作流程如下:

  1. 服務平臺管理端現在ZooKeeper中創建一個服務根路徑,在這個路徑下麵再創建服務提供方目錄和服務調用方目錄。
  2. 當服務提供方發起註冊時,會在服務提供方目錄中創建一個臨時節點,節點中存儲該服務提供方的註冊信息。
  3. 當服務調用方發起註冊時,會在服務提供方目錄中創建一個臨時節點,節點中存儲該服務提供方的註冊信息。
  4. 當服務提供方目錄下有節點數據發生變更時,ZooKeeper就會通知給發起訂閱的服務調用方。

基於ZooKeeper的服務發現有什麼問題?

當有超大批量的服務節點在同時發起註冊操作,ZooKeeper集群的CPU使用率會飆升,導致ZooKeeper集群無法工作。

這本身就是ZooKeeper的性能問題,當連接到ZooKeeper的節點數量特別多,對ZooKeeper的讀寫操作會特別頻繁,而且當ZooKeeper存儲的目錄達到一定數量時,ZooKeeper就會變得不穩定,CPU使用率持續升高,直到宕機。

ZooKeeper的一大特點就是強一致性,集群中的每個節點的數據每次發生變更操作時,都會通知其他節點同時執行跟新,這樣它就要求每個節點的數據能夠實時的完全一致,從而導致了ZooKeeper集群性能的下降。

基於消息匯流排的服務發現機制的工作流程是怎樣的?

基於消息匯流排的服務發現流程圖如下:

它的工作流程如下:

  1. 當有服務上線,註冊中心節點收到註冊請求,服務列表數據發生變化,會生成一個消息,推送給消息匯流排,每個消息都有一個整體遞增版本。
  2. 消息匯流排會主動推送消息到各個註冊中心,同時註冊中心也會定期拉取消息。對於獲取到消息的在消息回放模塊裡面回放只接受大於本地版本號的消息,小於本地版本號的消息直接丟棄,從而實現最終一致性。
  3. 消費者定於可以從註冊中心記憶體拿到指定介面的全部服務實例,並緩存到消費者的記憶體中。
  4. 採取推拉模式,消費者可以及時地拿到服務實例增量變化情況,並和記憶體中的混存數據進行合併。

通過消息匯流排的方式,我們就可以完成註冊中心集群間數據變更的通知,保證數據的最終一致性,並能及時地觸發註冊中心的服務下發操作。

服務發現的特性是允許我們在設計超大規模集群服務發現系統的時候,捨棄一致性,更多的考慮系統的健壯性,因此,在實際工作中,最終一致性是更為常用的策略。

    作者:李潘     出處:http://wing011203.cnblogs.com/     本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 寫在前面 linux系統內核為上層應用程式提供了多種進程間通信(IPC)的手段,適用於不同的場景,有些解決進程間數據傳遞的問題,另一些則解決進程間的同步問題。對於同樣一種IPC機制,又有不同的API供應用程式使用,目前有POSIX IPC以及System V IPC可以為應用程式提供服務。後續 ...
  • flex佈局 -- 彈性盒模型 display: flex; 就會讓其變成彈性盒子 當把一個元素的 display 屬性設置為 flex 或者 inline-flex 後,它就成了一個容器。 flex 與 inline-flex 的關係就類似 block 與 inline-block 的關係,定義里 ...
  • 簡介: 組合模式,屬於結構型的設計模式。將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。 組合模式分兩種狀態: 透明方式,子類的所有介面一致,使其葉子節點和枝節點對外界沒有區別。 安全方式,子類介面不一致,只實現特定的介面。 適用場景: 希望 ...
  • AOP-02 4.問題提出 在上一篇的MyProxyProvider類中,我們的輸出語句功能比較弱,在實際開發中,我們希望是以一個方法的形式,嵌入到真正執行的目標方法前,怎麼辦? 1.使用土方法解決 需求分析:使用土方法解決前面的問題,後面使用spring的aop組件完成 改進MyProxyProv ...
  • 2023-01-24 一、搜索查找類命令 1、find命令 (1)find -name "*.txt" (功能描述:查找當前目錄下包含“.txt”的文件) 2、grep過濾查找及“|”管道符 管道符,“|”,表示將前一個命令的處理結果輸出傳遞給後面的命令處理 (1)ll | grep -n test ...
  • 前言 對於一個懶懶的,不想寫高精的人(就是我),每次都會遭遇到答案爆$long$ $long$的危險 比如說這道題: 題目傳送門 最後的$23-25$的兩個點,$long$ $long$甚至$unsigned$ $long$ $long$都無法滿足,難道真的要手打高精度了嗎? 不,我們有$\_$$\ ...
  • 2023-01-24 一、CentOS中的時間日期類命令 1、date顯示當前時間 (1)date (功能描述:顯示當前時間) (2)date + %Y (功能描述:顯示當前年份) (3)date + %m (功能描述:顯示當前月份) (4)date + %d (功能描述:顯示當前是哪一天) (5) ...
  • 2023-01-24 一、幫助命令 1、基本語法 man[命令或配置文件] 功能描述:獲得幫助信息 2、顯示說明 (1)NAME:命令的名稱和單行描述 (2)SYNOPSIS:怎樣使用命令 (3)DESCRIPTION:命令功能的深入討論 (4)EXAMPLES:怎樣使用命令的例子 (5)SEE A ...
一周排行
    -Advertisement-
    Play Games
  • 一個自定義WPF窗體的解決方案,借鑒了呂毅老師的WPF製作高性能的透明背景的異形視窗一文,併在此基礎上增加了滑鼠穿透的功能。可以使得透明窗體的滑鼠事件穿透到下層,在下層窗體中響應。 ...
  • 在C#中使用RabbitMQ做個簡單的發送郵件小項目 前言 好久沒有做項目了,這次做一個發送郵件的小項目。發郵件是一個比較耗時的操作,之前在我的個人博客裡面回覆評論和友鏈申請是會通過發送郵件來通知對方的,不過當時只是簡單的進行了非同步操作。 那麼這次來使用RabbitMQ去統一發送郵件,我的想法是通過 ...
  • 當你使用Edge等瀏覽器或系統軟體播放媒體時,Windows控制中心就會出現相應的媒體信息以及控制播放的功能,如圖。 SMTC (SystemMediaTransportControls) 是一個Windows App SDK (舊為UWP) 中提供的一個API,用於與系統媒體交互。接入SMTC的好 ...
  • 最近在微軟商店,官方上架了新款Win11風格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,這款應用引入了前沿的Fluent Design UI設計,為用戶帶來全新的視覺體驗。 ...
  • 1.簡單使用實例 1.1 添加log4net.dll的引用。 在NuGet程式包中搜索log4net並添加,此次我所用版本為2.0.17。如下圖: 1.2 添加配置文件 右鍵項目,添加新建項,搜索選擇應用程式配置文件,命名為log4net.config,步驟如下圖: 1.2.1 log4net.co ...
  • 之前也分享過 Swashbuckle.AspNetCore 的使用,不過版本比較老了,本次演示用的示例版本為 .net core 8.0,從安裝使用開始,到根據命名空間分組顯示,十分的有用 ...
  • 在 Visual Studio 中,至少可以創建三種不同類型的類庫: 類庫(.NET Framework) 類庫(.NET 標準) 類庫 (.NET Core) 雖然第一種是我們多年來一直在使用的,但一直感到困惑的一個主要問題是何時使用 .NET Standard 和 .NET Core 類庫類型。 ...
  • WPF的按鈕提供了Template模板,可以通過修改Template模板中的內容對按鈕的樣式進行自定義。結合資源字典,可以將自定義資源在xaml視窗、自定義控制項或者整個App當中調用 ...
  • 實現了一個支持長短按得按鈕組件,單擊可以觸發Click事件,長按可以觸發LongPressed事件,長按鬆開時觸發LongClick事件。還可以和自定義外觀相結合,實現自定義的按鈕外形。 ...
  • 一、WTM是什麼 WalkingTec.Mvvm框架(簡稱WTM)最早開發與2013年,基於Asp.net MVC3 和 最早的Entity Framework, 當初主要是為瞭解決公司內部開發效率低,代碼風格不統一的問題。2017年9月,將代碼移植到了.Net Core上,併進行了深度優化和重構, ...