淺談服務介面的高可用設計

来源:https://www.cnblogs.com/Jcloud/archive/2023/01/13/17048630.html
-Advertisement-
Play Games

作為一個後端研發人員,開發服務介面是我正常不過的工作了,這些介面不管是面向前端HTTP或者是供其他服務RPC遠程調用的,都繞不開一個共同的話題就是“高可用”,介面開發往往看似簡單,但保證高可用這塊實現起來卻不並沒有想想的那麼容易,接下來我們就看一下,一個高可用的介面是該考慮哪些內容,同時文中有不足的... ...


作者:京東零售 王磊

前言

作為一個後端研發人員,開發服務介面是我正常不過的工作了,這些介面不管是面向前端HTTP或者是供其他服務RPC遠程調用的,都繞不開一個共同的話題就是“高可用”,介面開發往往看似簡單,但保證高可用這塊實現起來卻不並沒有想想的那麼容易,接下來我們就看一下,一個高可用的介面是該考慮哪些內容,同時文中有不足的歡迎批評指正。

到底啥是高可用

用一句簡單的話來概就是我們的系統具不具備應對和規避風險的能力。

為啥做高可用

1. 程式都是有人開發的,在開發過程中會犯錯從而導致線上事故的發生
2. 系統運行依賴各種運行環境:CPU、記憶體、硬碟、網路等等,而這些都有可能損壞
3. 業務拉新用戶正在註冊賬號,結果註冊介面掛了用戶體驗受影響
4. 雙十一、618等大促大量用戶下單,結果下單服務介面掛了GMV受影響等等
5. 其他未知因素等等
總之為了應對這些不可控因素的發生,我們必須要做高可用

高可用的關鍵點

我們說過高可用的本質是系統是否具備應對和規避風險的能力,那麼從這個角度出發來設計高可用介面的有以下幾個關鍵因素:Dependence(依賴)、Probability(概率)、Time(時長)、Scope(範圍)

1. 依賴的資源相對少
2. 風險的概率足夠低
3. 影響的範圍足夠小
4. 影響時長足夠短

介面高可用設計的幾個原則

結合這些關鍵點,我們來看一下具體具體註意事項

1、控制依賴

能少依賴就少依賴,能不強依賴就不強依賴

少依賴
例如:日常每分鐘10個請求,查詢Mysql數據即可滿足,此時盲目引入Redis中間件,不僅浪費資源而且增加系統複雜性

弱依賴
例如:用戶註冊服務強依賴新用戶優惠券發放服務,當優惠券發放服務故障後,整個註冊不可用,好的方式是採用弱依賴,使用非同步化的
方式,這樣優惠券發送服務不可用時,不會影響註冊鏈路。

2、避免單點

避免單點故障的核心是通過備份或者冗餘快速的進行容錯

1. 我們採用多機房多實力部署我們應用來保障故障風險分攤,一旦有一臺伺服器出現問題,其他服務仍然能夠繼續支撐我們的服務
2. 每次上線我們都會保留上一次上線發佈版本,這樣一旦上線的程式出現問題我們能夠快速回滾到上一版本
3. 每個介面至少保障2人知道相關業務,一旦線上服務出現問題,其中任何一人一個能夠快速處理相關線上問題
4. 不管是Mysql還是Redis等中間件都支持數據主備機群部署

類似的例子很多這裡就不再一一列舉了

3、負載均衡

將風險進行分攤避免分險擴散

例如:無論是Ngnix或者JSF的,其負載均衡目的就是儘量的將流量分散到不同的伺服器節點上,這樣可以有效的保障單節點因系統瓶頸
問題而引發一系列的風險。 

像上面這個例子我想每個研發人員都知道也都會這麼做,但是是不是所有的場景我們都考慮到均衡這個問題?

例如:通常為了提高讀併發的能力,我們會把數據緩存到JIMDB中,但是因為緩存的key出現了熱點數據導致JIMDB單分片負載過高,恰
好,這個分片上也緩存了其他數據,但是因為CPU負載過高,導致查詢性能變差,大量的超時,影響了業務。所以,我們在介面設計
的時候,假如遇到類似場景,也要充分考慮數據存儲的均衡性,同時針對熱點數據做好監控,隨時支持動態均衡。

4、資源隔離

隔離的目的將風險控制在可控範圍內,避免風險擴散

例如:介面部署之間服務部署物理上是相互隔離的,避免單機房或者單伺服器出現故障影響整個服務

例如:我們在存儲業務數據的時候會將數據分庫分表,數據通過不同分片存儲,這樣就不會導致某個伺服器掛掉影響到整個服務

5、介面限流

限流是一種保護措施,目的是將風險控制在可控範圍內

我們在開發介面的時候,一定要結合業務流量情況進行限流措施,限流一方面處於對自身服務資源的保護,同時也是對依賴資源的一種
保護措施。

目前集團JSF在流量控制這塊已經有了對應的限流處理能力,同時我們也可以結合實際業務進行限流模塊的開發。

6、服務熔斷

熔斷也是一種保護措施,目的是將風險控制在可控範圍內,避免風險擴散

例如:經常我們服務A會同時調用B、C、D多個服務,當我們依賴的服務其中一個出現故障或者性能下降的時候,就是導致整體服務
可用率下降,所以我們在開發此類服務的時候,一定要註意介面之間的隔離。我們可以利用類似Hystrix組件實現,也可以藉助DUCC
進行手動隔離。

其實熔斷也是一種控制資源依賴的一種,將強依賴降級為弱依賴

7、非同步處理

將同步操作轉為非同步操作

例如:用戶頁面領取一些權益,針對領取這個服務在大促期間因為用戶流量較大,為了避免系統負載,此時採用MQ非同步接收用戶領取
請求然後進行優惠券發放,這樣不僅極大的減少了事故的影響範圍,也減少問題發生概率。

8、降級方案

服務降級屬於一種問題發生後的補救措施,通過服務降級可以減少一部分風險影響範圍

對於重要的服務介面我們都要具備完善的降級方案,這裡需要說明的是,降級有損的,我們一定要在系統開發前就要考慮各種問題
發生的可能,降級的前提是通過降級非核心業務保證核心業務運行。

例如:大促峰值期間,一般會提前降級掉很多功能,同時限流,主要是為了保護峰值絕大部分人的交易支付體驗。

9、灰度發佈

通過灰度發佈降低風險影響範圍

例如:我們上線一個新服務,通過一定的灰度策略,讓用戶先行體驗新版本的應用,通過收集這部分用戶對新版本應用的反饋以及
對新版本功能、性能、穩定性等指標進行評論,進而決定繼續放大新版本投放範圍直至全量升級或回滾至老版本。根據線上反饋結果,
做到查漏補缺,發現重大問題,可回滾“舊版本”

10、混沌工程

通過提前對系統進行一些破壞性的手段,提前發現潛在問題

例如:一個複雜介面系統依賴了太多的服務和組件,這些組件隨時隨地都可能會發生故障,而一旦它們發生故障,會不會如蝴蝶效應
一般造成整體服務不可用呢,我們並不知道,因此我們可以藉助泰山平臺混沌工程進行演練,針對發生的場景制定各種預案,將風險
控制在可控範圍內。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、audio標簽的使用 1、Audio 對象屬性 2、對象方法 二、效果 效果如下: 三、代碼 代碼如下: MusicPlayer.vue <template> <div class="music"> <!-- 占位 --> <div ...
  • 摘要:輸入網址並點回車,後臺到底發生了什麼。透析 HTTP 協議與 TCP 連接之間的千絲萬縷的關係。掌握為何是三次握手四次揮手?time_wait 存在的意義是什麼?全面圖解重點問題,再也不用擔心面試問這個問題。 本文分享自華為雲社區《輸入網址,小手一點,後面到底發生了什麼?》,作者:龍哥手記。 ...
  • 1.按鈕點擊後添加loading,介面返回成功後再移除loading(經過多次嘗試發現,此方法不能完全確保只調用一次介面,第二次添加時仍會多次調用介面),方法如下: html代碼: <el-button @click="onSave" :loading="onLoading">保存</el-butt ...
  • JavaScript 中,對於普通對象,不能直接使用 length 來獲取對象的長度,因為 JavaScript 對象並不是一種有序的集合,沒有長度的概念。 對於數組或者類數組對象,可以使用 .length 來獲取它們的長度,因為它們是有序集合。 對於字元串也可以使用.length來獲取長度,因為字... ...
  • 我們是袋鼠雲數棧 UED 團隊,致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。 前言 訪問控制(Access control)是指對訪問者向受保護資源進行訪問操作的控制管理。該控制管理保證被授權者可訪問受保護資源,未被授權者不能訪問受保護資源。 現 ...
  • 在 CSS 中,倒影是一種比較常見的效果。今天,我們就將嘗試,使用 CSS 完成各類不同的倒影效果,話不多說,直接進入主題。 實現倒影的兩種方式 首先,快速過一下在 CSS 中,實現倒影的 2 種方式。 使用 -webkit-box-reflect 正常而言,-webkit-box-reflect ...
  • 基於AWS雲SaaS多租戶架構設計租戶與用戶概念單租戶與多租戶多租戶的好處 採用多租戶架構方法將為你的SaaS應用程式帶來廣泛的有價值的好處。 讓我們來看看下麵的貢獻。 a) 利用多租戶架構策略,減少伺服器基礎設施成本。 與其為每個客戶創建一個SaaS環境,不如為所有客戶提供一個應用環境。這使你的A ...
  • 隨著互聯網的發展,用戶在使用網路時對網站的瀏覽速度和效果愈加重視,但由於網民數量激增,網路訪問路徑過長,從 而使用戶的訪問質量受到嚴重影響。特別是當用戶與網站之間的鏈路被突發的大流量數據擁塞時,對於異地互聯網用戶急速增加的地區來說,訪問質量不良更是一個 急待解決的問題。如何才能讓各地的用戶都能夠進行 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...