《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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...