《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
  • 在本篇教程中,我們學習瞭如何使用 Taurus.MVC WebMVC 框架創建一個簡單的頁面。 我們創建了一個控制器並編寫了一個用於呈現頁面的方法,然後創建了對應的視圖,並最終成功運行了應用程式。 在下一篇教程中,我們將繼續探索 Taurus.MVC WebMVC 框架的更多功能和用法。 ...
  • 一:背景 1. 講故事 很多.NET開發者在學習高級調試的時候,使用sos的命令輸出會發現這裡也看不懂那裡也看不懂,比如截圖中的這位朋友。 .NET高級調試屬於一個偏冷門的領域,國內可觀測的資料比較少,所以很多東西需要你自己去探究源代碼,然後用各種調試工具去驗證,相關源代碼如下: coreclr: ...
  • 我一直都以為c中除以2的n次方可以使用右移n位代替,然而在實際調試中發現並不都是這樣的。是在計算餘數是發現了異常 被除數:114325068 右移15計算結果:3488 除法取整計算結果:3489 右移操作計算餘數:33772 除法取整計算餘數:1005 顯然:這是不一樣的。 移位操作是一條cpu指 ...
  • 在上一篇文章中,我們介紹了ReentrantLock類的一些基本用法,今天我們重點來介紹一下ReentrantLock其它的常用方法,以便對ReentrantLock類的使用有更深入的理解。 ...
  • Excelize 是 Go 語言編寫的用於操作電子錶格辦公文檔的開源基礎庫,2024年2月26日,社區正式發佈了 2.8.1 版本,該版本包含了多項新增功能、錯誤修複和相容性提升優化。 ...
  • 雲採用框架(Cloud Adoption Framework,簡稱CAF)為企業上雲提供策略和技術的指導原則和最佳實踐,幫助企業上好雲、用好雲、管好雲,併成功實現業務目標。本雲採用框架是基於服務大量企業客戶的經驗總結,將企業雲採用分為四個階段,並詳細探討企業應在每個階段採取的業務和技術策略;同時,還 ...
  • 與TXT文本文件,PDF文件更加專業也更適合傳輸,常用於正式報告、簡歷、合同等場合。項目中如果有使用Java將TXT文本文件轉為PDF文件的需求,可以查看本文中介紹的免費實現方法。 免費Java PDF庫 本文介紹的方法需要用到Free Spire.PDF for Java,該免費庫支持多種操作、轉 ...
  • 指針和引用 當我們需要在程式中傳遞變數的地址時,可以使用指針或引用。它們都可以用來間接訪問變數,但它們之間有一些重要的區別。 指針是一個變數,它存儲另一個變數的地址。通過指針,我們可以訪問存儲在該地址中的變數。指針可以被重新分配,可以指向不同的變數,也可以為NULL。指針使用*運算符來訪問存儲在地址 ...
  • 即使再小再簡單的需求,作為研發開發完畢之後,我們可以直接上線麽?其實很多時候事故往往就是由於“不以為意”發生的。事故的發生往往也遵循“墨菲定律”,這就要求我們更要敬畏線上,再小的需求點都需要經過嚴格的測試驗證才能上線。 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、是什麼 許可權是對特定資源的訪問許可,所謂許可權控制,也就是確保用戶只能訪問到被分配的資源 而前端許可權歸根結底是請求的發起權,請求的發起可能有下麵兩種形式觸發 頁面載入觸發 頁面上的按鈕點擊觸發 總的來說,所有的請求發起都觸發自前端路由或 ...