《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
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...