主頁 > 軟體設計 > 服務探活的五種方式

服務探活的五種方式

2022-01-17 18:01:16 軟體設計

幾個月前,我在《4個實驗,徹底搞懂TCP連接的斷開》這篇文章中給自己挖了個坑:

image

文中提到的實際問題就是服務探活,今天來填上這個坑,


在微服務架構下,服務提供方(Provider)的節點一般不止一個,消費方(Consumer)根據負載均衡演算法挑選一個健康的節點進行呼叫,識別Provider節點是否健康,這便是服務探活 要討論的內容,

健康的節點可定義為能正常回應Consumer請求的節點,不健康自然是不能正常回應Consumer請求的節點

不健康的原因可能是物理上的斷電、斷網、硬體故障,也可能是網路延遲、行程例外退出或行程無法處理請求,

總之一句話總結起來就是Provider節點沒有摘除流量前,就無法處理請求了,可以分為三類:

  • 系統例外:如斷電、斷網、其他硬體故障、或作業系統例外退出
  • 行程例外退出:行程例外退出,埠掛掉,如有注銷機制但沒來得及注銷,如執行了kill -9
  • 行程無法處理請求:埠還在,但服務無法正常回應,如Full GC期間

一個Provider節點的狀態只有健康和不健康,由健康到不健康稱之為探死,由不健康到健康稱之為探活,一般我們不分這么細,統一叫探活

至于是誰來探,可能是Consumer,也可能是注冊中心,甚至是某個單獨的探活組件,我們就從探活的發起者來列舉目前主流的探活方式,


Consumer被動探活

最簡單的是在Consumer側進行探活,如果Consumer呼叫Provider報錯,則Consumer將該Provider剔掉,為了防止偶發的網路抖動或其他干擾,可設定一個時間視窗,視窗內失敗達N 次則剔除,當過了這段時間,再把這個Provider重置為正常,

這種方式的典型代表是Nginx,Nginx可配置多長時間內,失敗多少次則認為該Provider不可用,其失敗可以是連接失敗、也可以是某些http狀態碼(如4xx,5xx)

這種方案的缺點很明顯,需要真實流量去檢測,如果配置了失敗繼續轉發給下一個Provider,則時間視窗的開始的一段時間內耗時上升,未配置則直接報錯,所以無論怎么配置,對服務都是有影響的,

Consumer主動探活

Consumer被動健康檢查的主要問題在于使用了真實流量檢測,其實只要稍微改一改,使用旁路的方式去檢測即可避免,

阿里的Tengine開源了一個nginx_upstream_check_module模塊來做主動健康檢查,

這個旁路可以一直去探測Provider,當檢測到例外時,將其標記為不可用狀態,請求不再發往該Provider,若檢測到Provider 健康時,再將其標記為健康,

Consumer側的探活在RPC框架實作的比較少,不知道是基于怎樣的一種考慮,其實有些企業內會在Consumer側已經加入了探活機制,比如愛奇藝在Dubbo的Consumer側增加了探活機制,其實我所在的公司內部RPC框架也是有Consumer側的服務探活,

參考《愛奇藝在 Dubbo 生態下的微服務架構實踐》https://developer.aliyun.com/article/771495

但Dubbo官方沒有集成,至于為什么,我也去github上問過,不過沒人回復~

Provider上報心跳

當有一個注冊中心時,探活這項任務就可以交給注冊中心了,

最簡單的,我們想到了心跳保持這個策略,Provider注冊成功后,一直向注冊中心發送心跳包,注冊中心定時檢查Provider,如果長時間未發送心跳包,就將其置為不可用,并告知Consumer,如果心跳恢復,則將其恢復并通知,

某些組件也支持這種續約的特性,如etcd、redis等都可以構建類似的系統,

這種方式的代表是Nacos 1.x 版本中的臨時實體

慢慢你會發現這種方式摘除故障節點的時效性和資源的使用成正相關,如果你想要更好的時效性,就必須縮短心跳間隔,從而會增加心跳請求量,每次心跳得更新每個節點的上次心跳時間,占用了大量資源,

Provider與注冊中心會話保持

為了解決心跳請求占用大量資源的問題,我們想到了TCP 連接不是一個天然的健康檢查機制嗎?如果僅僅依靠TCP連接可以嗎?

這就是之前文章埋下的坑,再次總結一下這篇文章《4個實驗,徹底搞懂TCP連接的斷開》中關于TCP連接斷開的場景:

  • 如果是行程終止、無論是正常或者是例外,只要作業系統還在,TCP連接就會正確斷開
  • 如果是斷電、斷網或其他因素導致作業系統掛掉,則網路不一定能正確斷開,還得分情況
    • 如果此時注冊中心有往Provider發送資料,那么是能及時感知到Provider的例外,并斷開連接的
    • 如果注冊中心沒有往Provider發送資料,是不能及時感知連接的斷開,即使配置了TCP的KeepAlive,也需要大概2小時才能感知到

2小時肯定不能接受,為了防止這種情況,光靠TCP是不夠的,還得在應用層實作一個心跳檢測,為了節省資源,可以將心跳包設計的很小,發送頻率不需要那么高,通常1分鐘內能感知即可,

因為只有斷電、斷網或硬體故障才會導致無法感知連接的斷開,這個比例很小,

可以參考下圖,雖然圖中的資料是我杜撰的,但八九不離十吧,可以看到系統例外只占1%,這1%中未發資料可能更少,所以可以認為這個概率很小,

image

這種方式比較常見,像Dubbo使用的Zookeeper,Nacos 2.x版本(gRPC)的臨時實體,SOFARegistry等等都用了這這種方式,

其中SOFARegistry比較有意思,它提出了一種連接敏感的長連接,乍一看以為用了什么黑科技,后來看了代碼發現就是TCP連接加應用層的心跳檢測,這些被他們封裝在SOFABolt通信框架中,

image

參考《海量資料下的注冊中心 - SOFARegistry 架構介紹》https://mp.weixin.qq.com/s/mZo7Dg6gfNqXoetaqgwMww

但這個方式也有一個明顯的缺點,如果網路狀況不好的情況下,TCP連接比較容易斷開,會導致節點頻繁上下線,

注冊中心主動探測

除了上述的方式,還有一種注冊中心(甚至是一個單獨的組件)主動探測Provider的方式,與Consumer主動探測類似,只不過把探測任務移交給了注冊中心或一個單獨的組件,

主動探測有個最大的優勢是可以擴展非常豐富的探測方式,比如最常見的探測埠是否存活,又或者探測Provider的一個http介面回傳是否符合預期,甚至可以擴展為MySQL、Redis等等協議的探測,

這也是種能解決服務假死的探活方式,Nacos中的永久實體探活就是采用的這種方式,

但這種方式在實際使用的時候要考慮主動探測組件的高可用,高可用就得存在副本,可采取主備方式,

如果單機存在性能瓶頸,還得分布式探活,主備可能就不適合,得有一個分布式協調者,這要說又得長篇大論,但這里你知道有這么個事兒就可以了,


考量探活的指標有三個:

  • 能不能探出來?——功能性
  • 什么時候探出來?——時效性
  • 會不會探錯了?——穩定性

功能上最強的是帶語意的主動探測,時效性最強的要屬長連接會話保持,

穩定性不好說誰強誰弱,但一般會給一個集群設定一個探活摘除的比例,比如最多摘除50%機器,防止探活錯誤導致節點全部下線,這也算是一種兜底策略吧,


搜索關注微信公眾號"捉蟲大師",回復關鍵字「Nacos」送你一本《Nacos架構與原理》電子書,Dubbo資料也在準備中,不想錯過可以點個關注,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/413140.html

標籤:其他

上一篇:微服務架構 | 2.1 使用 Spring Cloud Config 管理服務配置項

下一篇:架構師必備:系統性解決冪等問題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more