服務發現:CP or AP?

1 服務發現的意義

為高可用,生產環境中服務提供方都以集群對外提供服務,集群里這些IP隨時可能變化,也需要用一本“通信錄”及時獲取對應服務節點,這獲取過程即“服務發現”。

對服務調用方和服務提供方,其契約就是接口,相當于“通信錄”中的姓名,服務節點就是提供該契約的一個具體實例。服務IP集合作為“通信錄”中的地址,從而可通過接口獲取服務IP的集合來完成服務的發現。即PRC框架的服務發現:RPC服務發現原理圖

1.1 服務注冊

在服務提供方啟動時,將對外暴露的接口注冊到注冊中心,注冊中心將這個服務節點的IP和接口保存

1.2 服務訂閱

在服務調用方啟動時,去注冊中心查找并訂閱服務提供方的IP,然后緩存到本地,并用于后續的遠程調用

2 為何不使用DNS?

服務發現的本質,就是完成接口跟服務提供者IP的映射。能否把服務提供者IP統一換成一個域名,利用DNS實現?

2.1 DNS流程

DNS查詢流程:

所有服務提供者節點都配置在同一域名下,調用方是可通過DNS拿到隨機的一個服務提供者的IP,并建立長連接,但業界為何不用這方案?

異常考慮
  • 若該IP端口下線了,服務調用者能否及時摘除服務節點
  • 若在之前已上線一部分服務節點,突然對這服務擴容,新上線的服務節點能否及時接收到流量

都不能。為提升性能和減少DNS服務壓力,DNS采取多級緩存,緩存時間較長,尤其JVM默認緩存是永久有效,所以服務調用者不能及時感知服務節點變化。

是否能加個負載均衡設備?將域名綁定到這臺負載均衡設備,通過DNS拿到負載均衡的IP。服務調用時,服務調用方就能直接跟VIP建立連接,然后由VIP機器完成TCP轉發:

VIP方案:

這是能解決DNS遇到的一些問題,但RPC里不是很合適:

  • 搭建負載均衡設備或TCP/IP四層代理,需額外成本
  • 請求流量都經過負載均衡設備,多經過一次網絡傳輸,浪費性能
  • 負載均衡添加節點和摘除節點,一般要手動添加,當大批量擴容和下線時,會有大量人工操作和生效延遲
  • 服務治理時,需更靈活的負載均衡策略,目前負載均衡設備的算法不滿足靈活需求

由此可見,DNS或者VIP方案雖然可以充當服務發現的角色,但在RPC場景里面直接用還是很難的。

3 基于zk的服務發現(CP)

服務發現的本質:完成接口跟服務提供者IP的映射。就是一種命名服務,還希望注冊中心完成實時變更推送,zk、etcd都能實現。

搭建一個zk集群作為注冊中心集群,服務注冊時,只需服務節點向zk寫入注冊信息,利用zk的Watcher機制完成服務訂閱與服務下發功能。

整體流程

基于ZooKeeper服務發現結構圖:

  1. 服務平臺管理端先在zk創建一個服務根路徑,可根據接口名命名(如:/service/com.javaedge.xxService),在這路徑再創建服務提供方目錄與服務調用方目錄(如:provider、consumer),分別存儲服務提供方、服務調用方的節點信息
  2. 當服務提供方發起注冊時,會在服務提供方目錄中創建一個臨時節點,節點中存儲該服務提供方的注冊信息
  3. 當服務調用方發起訂閱時,則在服務調用方目錄中創建一個臨時節點,節點中存儲該服務調用方的信息,同時服務調用方watch該服務的服務提供方目錄(/service/com.demo.xxService/provider)中所有的服務節點數據。
  4. 當服務提供方目錄下有節點數據發生變更時,zk通知給發起訂閱的服務調用方

zk缺陷

早期RPC框架服務發現就是基于zk實現,但后續團隊微服務化程度越來越高,zk集群整體壓力越來越高,尤其在集中上線時越發明顯。“集中爆發”是在一次大規模上線時,當時有超大批量服務節點在同時發起注冊操作,ZooKeeper集群的CPU飆升,導致集群不能工作,也無法立馬將zk集群重新啟動,一直到zk集群恢復后業務才能繼續上線。

根本原因就是zk本身性能問題,當連接到zk的節點數量特多,對zk讀寫特頻繁,且zk存儲目錄達到一定數量,zk將不再穩定,CPU持續升高,最終宕機。宕機后,由于各業務的節點還在持續發送讀寫請求,剛一啟動,zk就因無法承受瞬間的讀寫壓力,馬上宕機。

要重新考慮服務發現方案。

4 消息總線(AP)

zk強一致性,集群的每個節點的數據每次發生更新操作,都通知其它節點同時執行更新。它要求保證每個節點的數據實時完全一致,直接導致集群性能下降。

而RPC框架的服務發現,在服務節點剛上線時,服務調用方可容忍在一段時間后(如幾s后)發現這個新上線的節點。畢竟服務節點剛上線后的幾s內,甚至更長的一段時間內沒有接收到請求流量,對整個服務集群沒有什么影響,可犧牲掉CP(強制一致性),選擇AP(最終一致),換取整個注冊中心集群的性能和穩定性。

是否有一種簡單、高效,并且最終一致的更新機制,代替zk數據強一致的數據更新機制?最終一致性,可考慮消息總線機制。注冊數據可全量緩存在每個注冊中心的內存,通過消息總線來同步數據。當有一個注冊中心節點接收到服務節點注冊時,會產生一個消息推送給消息總線,再通過消息總線通知給其它注冊中心節點更新數據并進行服務下發,從而達到注冊中心間數據最終一致性。

4.1 總體流程

  • 服務上線,注冊中心節點收到注冊請求,服務列表數據變化,生成一個消息,推送給消息總線,每個消息都有整體遞增的版本
  • 消息總線主動推送消息到各注冊中心,同時注冊中心定時拉取消息。對獲取到消息的,在消息回放模塊里面回放,只接受大于本地版本號的消息,小于本地版本號的消息直接丟棄,實現最終一致性
  • 消費者訂閱可從注冊中心內存拿到指定接口的全部服務實例,并緩存到消費者的內存
  • 采用推拉模式,消費者可及時拿到服務實例增量變化情況,并和內存中的緩存數據進行合并。

為性能,這里采用兩級緩存,注冊中心和消費者的內存緩存,通過異步推拉模式確保最終一致性。

服務調用方拿到的服務節點不是最新的,所以目標節點存在已下線或不提供指定接口服務的情況,這時咋辦?這問題放到RPC框架里處理,在服務調用方發送請求到目標節點后,目標節點會進行合法性驗證,若指定接口服務不存在或正在下線,則拒絕該請求。服務調用方收到拒絕異常后,會安全重試到其它節點。

通過消息總線,完成注冊中心集群間數據變更的通知,保證數據最終一致性,并能及時觸發注冊中心的服務下發。服務發現的特性是允許我們在設計超大規模集群服務發現系統的時候,舍棄強一致性,更多考慮系統健壯性。最終一致性才是分布式系統設計更常用策略。

5 總結

通常可使用zk、etcd或分布式緩存(如Hazelcast)解決事件通知問題,但當集群達到一定規模之后,依賴的ZooKeeper集群、etcd集群可能就不穩定,無法滿足需求。

在超大規模的服務集群下,注冊中心所面臨的挑戰就是超大批量服務節點同時上下線,注冊中心集群接受到大量服務變更請求,集群間各節點間需要同步大量服務節點數據,導致:

  • 注冊中心負載過高
  • 各節點數據不一致
  • 服務下發不及時或下發錯誤的服務節點列表

RPC框架依賴的注冊中心的服務數據的一致性其實并不需要滿足CP,只要滿足AP即可。我們就是采用“消息總線”的通知機制,來保證注冊中心數據的最終一致性,來解決這些問題的。

如服務節點數據的推送采用增量更新的方式,這種方式提高了注冊中心“服務下發”的效率,而這種方式,還可用于如統一配置中心,用此方式可以提升統一配置中心下發配置的效率。

6 FAQ

某大廠中間件的用戶平臺,服務掛了,在注冊中心上還得手動刪除死亡的節點,若是zk,服務沒了,就代表會話也沒了,臨時節點應該會被通知到把?為何還要手動刪除?

臨時節點是需要等到超時時間之后才刪除,不夠實時。

如果要能切換流量,要服務端配置權重負載均衡策略,這樣服務器端即可通過調整權重安排流量。

服務消費者都是從注冊中心拉取服務提供者的地址信息,所以要切走某些服務提供者數據,只需要將注冊中心這些實例的地址信息刪除(其實下線應用實例,實際也是去刪除注冊中心地址信息),然后注冊中心反向通知消費者,消費者受到拉取最新提供者地址信息就沒有這些實例了。

通過服務發現來摘除流量是最常見的手段,還可以上下線狀態、權重等方式。

現有開源注冊中心是不是還沒有消息總線這種實現方式?消息總線有沒有開源實現?

現成MQ也可充當消息總線。

消息總棧類似一個隊列,隊列表示是遞增的數字,注冊中心集群的任何一個節點接收到注冊請求,都會把服務提供者信息發給消息總棧,消息總棧會像隊列以先進先出的原則推送消息給所有注冊中心集群節點,集群節點接收到消息后會比較自己內存中的當前版本,保存版本大的,這種方式有很強的實效性,注冊中心集群也可以從消息總棧拉取消息,確保數據AP,個人理解這是為了防止消息未接收到導致個別節點數據不準確,因為服務提供者可以向任意一個節點發送注冊請求,從而降低了單個注冊中心的壓力,而注冊和注冊中心同步是異步的,也解決了集中注冊的壓力,在Zookeeper中,因為Zookeeper注冊集群的強一致性,導致必須所有節點執行完一次同步,才能執行新的同步,這樣導致注冊處理性能降低,從而高I/O操作宕機。

當集中注冊時,消息總棧下發通知給注冊中心集群節點,對于單個節點也會不停的收到更新通知,這里也存在高I/O問題,會不會有宕機?event bus可以改造成主從模式保證高可用。

AP實現中“兩級緩存,注冊中心和消費者的內存緩存,通過異步推拉模式來確保最終一致性的具體實現?

推主要實現callback,拉的動作在客戶端。

消息總線策略怎么保證消息總線全局版本遞增?最簡單的用時間戳。

消息總線構建ap 型注冊中心,不是很理解。是多個注冊中心獨立提供讀寫,他們之間通過消息隊列做數據同步?那么一致性感覺不好保證,比如服務a 先注冊,再反注冊,但是分別發到兩個注冊中心節點,最終同步可能是亂序的哇?一般不會出現這種情況,只有連接斷開后,那需要重新注冊。

消息總線的另一個應用case:配置中心。

關注我,緊跟本系列專欄文章,咱們下篇再續!

作者簡介:魔都技術專家兼架構,多家大廠后端一線研發經驗,各大技術社區頭部專家博主,編程嚴選網創始人。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。

負責:

  • 中央/分銷預訂系統性能優化

  • 活動&優惠券等營銷中臺建設

  • 交易平臺及數據中臺等架構和開發設計

    目前主攻降低軟件復雜性設計、構建高可用系統方向。

參考:

  • 編程嚴選網

    本文由博客一文多發平臺 OpenWrite 發布!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716917.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716917.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716917.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(3)(3.1) FlightDeck FrSky發射器應用程序

文章目錄 前言 1 概述 2 Turnkey Packages 3 參數說明 前言 ?Craft and Theory 的 FlightDeck 可讓你輕松查看飛行模式、高度、速度、姿態和關鍵系統警報,包括故障保護和電池錯誤,如電池不平衡警告和發射機低電量警報。 1 概述 Craft and Theory 的…

【自然語言處理】NLP入門(二):1、正則表達式與Python中的實現(2):字符串格式化輸出(%、format()、f-string)

文章目錄 一、前言二、正則表達式與Python中的實現1.字符串構造2. 字符串截取3. 字符串格式化輸出3.1 %符號格式化字符串1. 一般形式2. 常用格式字符3. 最小寬度和精度4. 進位制和科學計數法5. 多個對象的格式化輸出6. 典例 3.2 format()方法格式化字符串1. 一般形式2. 參數傳遞…

51單片機-(中斷系統)

51單片機-(中斷系統) 了解51單片機中斷系統、中斷源、中斷響應條件和優先級等,通過外部中斷0實現按鍵控制LED亮滅為例理解中斷工作原理和編程實現過程。 1.中斷系統結構 89C51/52的中斷系統有5個中斷源 ,2個優先級,…

WiFi模塊引領智能家居革命:連接未來的生活

隨著科技的快速發展,智能家居正成為現代生活的一部分,極大地改變了我們與家庭環境互動的方式。其中,WiFi模塊作為關鍵的連接技術,在推動智能家居革命中發揮著不可忽視的作用。本文將深入探討WiFi模塊如何驅動智能家居革命。 設備互…

1027 打印沙漏

本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定17個“*”,要求按下列格式打印 ***** *** * *** ***** 所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到…

多線程:線程通信

線程通信 什么是線程通信 當多個線程共同操作共享的資源時,線程間通過某種方式互相告知自己的的狀態,以相互協調,并避免無效的資源爭奪。 線程通信的常見模型(生產者與消費者模型) 生產者線程負責生產數據消費者線…

對抽象工廠模式的理解

目錄 1 背景1.1 題目描述1.2 輸入描述1.3 輸出描述1.4 輸入示例1.5 輸出示例 2 抽象工廠模式3 思考3.1 我的實現3.2 什么時候用抽象工廠模式?(怎么用才是合適的?)3.3 [更好的例子](https://refactoringguru.cn/design-patterns/ab…

【探索Linux】—— 強大的命令行工具 P.24(網絡基礎)

閱讀導航 引言一、計算機網絡背景1. 網絡發展歷史 二、認識 "協議"1. 網絡協議概念2. 網絡協議初識(1)協議分層(2)OSI參考模型(Open Systems Interconnection Reference Model)(3&…

NoSQL--1.虛擬機網絡配置

目錄 1.初識NoSQL 1.1 NoSQL之虛擬機網絡配置 1.1.1 首先,導入預先配置好的NoSQL版本到VMware Workstation中 1.1.2 開啟虛擬機操作: 1.1.2.1 點擊開啟虛擬機: 1.1.2.2 默認選擇回車CentOS Linux(3.10.0-1127.e17.x86_64) 7 …

cobalt strike釣魚lnk報錯:無法連接到遠程服務器

筆者在學習 cobalt strike 制作釣魚文件時發現多次失敗,在 win10 虛擬機的 powershell 的多次排查后發現這樣一個報錯: 使用“1”個參數調用“DownloadString”時發生異常:“無法連接到遠程服務器“ 經過多次排查后發現問題出在 cs 的 team server上&…

解決:Glide 在回調中再次加載圖片報錯

一、問題說明 Glide 加載圖片時監聽了回調&#xff0c;并在失敗時再次加載其它圖片后報錯。 代碼&#xff1a; Glide.with(mContext).load(imgTeacher).listener(new RequestListener<Drawable>() {Overridepublic boolean onLoadFailed(Nullable GlideException e, O…

MCU 串口接收環形緩沖區的實現

環形緩沖區 1. 環形緩沖區的特性 1.先進先出 2. 當緩沖區被使用完&#xff0c;且又有新的數據需要存儲時&#xff0c;丟掉歷史最久的數據&#xff0c;保存最新的數據 現實中的存儲介質都是線性的&#xff0c;因此我們需要做一下處理&#xff0c;才能在功能上實現環形緩沖區 …

[計算機網絡]--I/O多路轉接之poll和epoll

前言 作者&#xff1a;小蝸牛向前沖 名言&#xff1a;我可以接受失敗&#xff0c;但我不能接受放棄 如果覺的博主的文章還不錯的話&#xff0c;還請點贊&#xff0c;收藏&#xff0c;關注&#x1f440;支持博主。如果發現有問題的地方歡迎?大家在評論區指正 目錄 一、poll函…

web漏洞與規避

文章目錄 一、XSS 跨站腳本攻擊1.1 XSS攻擊的主要類型反射型XSS存儲型XSSDOM型XSS 1.2 前端開發如何應對XSS 二、CSRF 跨站請求偽造2.1 CSRF例子2.2 前端開發如何應對CSRF 三、SQL 注入3.1 前端如何防御SQL注入 四、前端如何使用CSP 一、XSS 跨站腳本攻擊 攻擊者通過在受害者的…

stm32學習筆記:IIC通信(未完)

概述 第一塊&#xff1a;介紹協議規則&#xff0c;然后用軟件模擬的形式來實現協議。 第二塊&#xff1a;介紹STM32的iic外設&#xff0c;然后用硬件來實現協議。 程序一現象&#xff1a;通過軟件I2C通信&#xff0c;對MPU6050芯片內部的寄存器進行讀寫&#xff0c;寫入到配…

【Synchronized同步原理】

Synchronized同步原理 1. synchronized的使用&#xff1f;2. 如何保證線程安全的&#xff1f;3.可重入原理&#xff08;加鎖次數計數器&#xff09;4. 原子性和可見性(順序性) 1. synchronized的使用&#xff1f; 對象鎖方法鎖類鎖 2. 如何保證線程安全的&#xff1f; publi…

關于數據提交上傳服務端的數據類型以及項目打包上線的流程

1 請求頭的類型&#xff1a; content-type&#xff1b; 01: application/json 數據以json格式請求&#xff1a;{"key":"value"} 02: application/x-www.form-urlencoded from表單的數據格式 name"zs"&age12 03 mutipart/form-data…

重學SpringBoot3-自動配置機制

重學SpringBoot3-自動配置機制 引言Spring Boot 自動配置原理示例&#xff1a;Spring Boot Web 自動配置深入理解總結相關閱讀 引言 Spring Boot 的自動配置是其最強大的特性之一&#xff0c;它允許開發者通過最少的配置實現應用程序的快速開發和部署。這一切都得益于 Spring …

飛槳(PaddlePaddle)模型保存與加載教程

文章目錄 飛槳&#xff08;PaddlePaddle&#xff09;模型保存與加載教程1. 概述2. 訓練調優場景2.1 保存動態圖模型2.2 加載動態圖模型 3. 推理部署場景3.1 使用基礎API 4. 其他場景4.1 舊版本格式兼容載入4.2 靜態圖模型的保存與加載 5. 總結 飛槳&#xff08;PaddlePaddle&am…

OmniPlan Pro mac版:簡單、智能,項目管理新選擇!

OmniPlan Pro是一款功能強大的項目管理軟件&#xff0c;它以其直觀的用戶界面和豐富的功能&#xff0c;幫助用戶輕松管理各種復雜的項目。無論是個人任務還是團隊協作&#xff0c;OmniPlan Pro都能提供全面的解決方案&#xff0c;讓項目管理變得更加簡單高效。 OmniPlan Pro軟…