架構設計之服務限流

来源:https://www.cnblogs.com/toutou/archive/2018/09/25/9593569.html
-Advertisement-
Play Games

限流可以認為服務降級的一種,限流就是限制系統的輸入和輸出流量已達到保護系統的目的。一般來說系統的吞吐量是可以被測算的,為了保證系統的穩定運行,一旦達到的需要限制的閾值,就需要限制流量並採取一些措施以完成限制流量的目的。比如:延遲處理,拒絕處理,或者部分拒絕處理等等。在介紹限流概念之前,我們先來聊聊身... ...


限流可以認為服務降級的一種,限流就是限制系統的輸入和輸出流量已達到保護系統的目的。一般來說系統的吞吐量是可以被測算的,為了保證系統的穩定運行,一旦達到的需要限制的閾值,就需要限制流量並採取一些措施以完成限制流量的目的。比如:延遲處理,拒絕處理,或者部分拒絕處理等等。

v服務限流概念

在介紹限流概念之前,我們先來聊聊身邊有哪些限流,如果有在帝都的碼農估計對限流是最深有感觸的,帝都但凡開個XXX會議,各大地鐵站都會限流。

每年的雙11都是剁手族的天堂,11月11號0點0幾秒的時候,下麵這些場景或許你曾經遇到過。

架構設計之服務限流

架構設計之服務限流

當然,這幾年雙11各大電商對併發的支持做的越來越好,這裡只是借鑒雙11剛推出之際,常常需要應對的一些問題。

通過這兩個場景,基本上服務限流的作用也就明白:

「服務限流」其實是指當系統資源不夠,不足以應對大量請求,即系統資源與訪問量出現矛盾的時候,我們為了保證有限的資源能夠正常服務,因此對系統按照預設的規則進行流量限制或功能限制的一種方法。

v為何要服務限流

再舉一個我們生活中的例子:一些熱門的旅游景點,往往會對每日的旅游參觀人數有嚴格的限制,比如北京的故宮、歡樂谷等,每天只會賣出固定數目的門票,如果你去的晚了,可能當天的票就已經賣完了,當天就無法進去游玩了,即使你進去了,排隊也能排到你懷疑人生。

為什麼旅游景點要做這樣的限制呢?多賣一些門票多賺一些錢豈不是更好?

其實對於旅游景點而言,她們也很無奈,因為景點的服務資源有限嘛,每日能服務的人數是有限的,一旦放開限制了,景點的工作人員就會不夠用,衛生情況也得不到保障,安全也有隱患,超密集的人群也會嚴重的影響游客的體驗。但由於景區名氣大,來游玩的旅客絡繹不絕,遠超出了景區的承載能力,因此景區只好做出限制每日人員流量的舉措。

同理,在IT軟體行業中,系統服務也是這樣的。

如果你的系統理論是時間單位內可服務100W用戶,但是今天卻突然來了300W用戶,由於用戶流量的隨機性,如果不加以限流,很有可能這300W用戶一下子就壓垮了系統,導致所有人都得不到服務。

因此為了保證系統至少還能為100W用戶提供正常服務,我們需要對系統進行限流設計。

有的人可能會想,既然會有300W用戶來訪問,那為啥系統不幹脆設計成能足以支撐這麼大量用戶的集群呢?

這是個好問題。如果系統是長期有300W的用戶來訪問,肯定是要做上述升級的,但是常常面臨的情況是,系統的日常訪問量就是100W,只不過偶爾有一些不可預知的特定原因導致的短時間的流量激增,這個時候,公司往往出於節約成本的考慮,不會為了一個不常見的尖峰來把我們的系統擴容到最大的尺寸。

v如何服務限流

對系統服務進行限流,一般有如下幾個模式:

1. 熔斷:

這個模式是需要系統在設計之初,就要把熔斷措施考慮進去。當系統出現問題時,如果短時間內無法修複,系統要自動做出判斷,開啟熔斷開關,拒絕流量訪問,避免大流量對後端的過載請求。系統也應該能夠動態監測後端程式的修複情況,當程式已恢復穩定時,可以關閉熔斷開關,恢復正常服務。

2. 服務降級:

將系統的所有功能服務進行一個分級,當系統出現問題,需要緊急限流時,可將不是那麼重要的功能進行降級處理,停止服務,這樣可以釋放出更多的資源供給核心功能的去用。

例如在電商平臺中,如果突發流量激增,可臨時將商品評論、積分等非核心功能進行降級,停止這些服務,釋放出機器和CPU等資源來保障用戶正常下單,而這些降級的功能服務可以等整個系統恢復正常後,再來啟動,進行補單/補償處理。除了功能降級以外,還可以採用不直接操作資料庫,而全部讀緩存、寫緩存的方式作為臨時降級方案。

3. 延遲處理:

這個模式需要在系統的前端設置一個流量緩衝池,將所有的請求全部緩衝進這個池子,不立即處理。然後後端真正的業務處理程式從這個池子中取出請求依次處理,常見的可以用隊列模式來實現。這就相當於用非同步的方式去減少了後端的處理壓力,但是當流量較大時,後端的處理能力有限,緩衝池裡的請求可能處理不及時,會有一定程度延遲。

4. 特權處理:

這個模式需要將用戶進行分類,通過預設的分類,讓系統優先處理需要高保障的用戶群體,其它用戶群的請求就會延遲處理或者直接不處理。

那在實際項目中,對訪問流量的限制,可採用如下幾種技術方法:

♛ 熔斷技術

熔斷的技術可以重點參考Netflix的開源組件hystrix的做法,主要有三個模塊:熔斷請求判斷演算法、熔斷恢復機制、熔斷報警。

服務限流 來自hystrix github wiki         查看大圖

♛ 計數器方法

系統維護一個計數器,來一個請求就加1,請求處理完成就減1,當計數器大於指定的閾值,就拒絕新的請求。

基於這個簡單的方法,可以再延伸出一些高級功能,比如閾值可以不是固定值,是動態調整的。另外,還可以有多組計數器分別管理不同的服務,以保證互不影響等。

♛ 隊列方法

就是基於FIFO隊列,所有請求都進入隊列,後端程式從隊列中取出待處理的請求依次處理。

基於隊列的方法,也可以延伸出更多的玩法來,比如可以設置多個隊列以配置不同的優先順序。

♛ 令牌桶方法

首先還是要基於一個隊列,請求放到隊列裡面。但除了隊列以外,還要設置一個令牌桶,另外有一個腳本以持續恆定的速度往令牌桶裡面放令牌,後端處理程式每處理一個請求就必須從桶里拿出一個令牌,如果令牌拿完了,那就不能處理請求了。我們可以控制腳本放令牌的速度來達到控制後端處理的速度,以實現動態流控。

v註意事項

我們在做服務限流的時候,還是有一些原則和事項需要註意的:

  • 實時監控:系統必須要做好全鏈路的實時監控,才能保證限流的及時檢測和處理。
  • 手動開關:除系統自動限流以外,還需要有能手動控制的開關,以保證隨時都可以人工介入。
  • 限流的性能:限流的功能理論上是會在一定程度影響到業務正常性能的,因此需要做到限流的性能優化和控制。

v博客總結

系統故障常常都是不可預測且難以避免的,因此作為系統設計師的我們,必須要提前預設各種措施,以應對隨時可能的系統風險。


作  者:請叫我頭頭哥
出  處:http://www.cnblogs.com/toutou/
關於作者:專註於基礎平臺的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!


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

-Advertisement-
Play Games
更多相關文章
  • 序列化和反序列化:Java的對象序列化是指將那些實現了Serializable介面的對象轉換成一個位元組序列,並能夠在以後將這個位元組序列完全恢復為原來的對象。 為什麼要序列化:數據持久化存儲(包括資料庫存儲、文件存儲等等),當然也可以叫流式數據傳輸。 如何去實現序列化和反序列化:數據結構對象上只要實現 ...
  • 電子版參考書:https://pan.baidu.com/s/15R08yEjLDj8FxrBwnUaTyA 註:僅限網上學習交流,如有侵權請聯繫我 我們一起學習┏(^0^)┛ 自我介紹,我是一個python邁過基礎游蕩在爬蟲自學之路的一隻小螞蟻。在電腦編程漫長枯燥的道路上,很多技術博客幫助了我, ...
  • 我學習彙編用的是王爽的《彙編語言》第三版,書中是以8086處理器為例,是工作在實模式下的,而當下的個人電腦處理器都是工作在保護模式下的。所以需要一個虛擬的工作在實模式下的處理器,這裡主要用到DOSBOX軟體,Debug(調試工具),masm(編譯鏈接工具),Editor(dos下的編輯器)。 Ⅰ· ...
  • 菜鳥的8086彙編入門之旅,偶有錯處恭請大佬們指正。 Ⅰ· 閑說一下 Ⅱ · 基礎知識 Ⅲ·總結 ...
  • 面向對象(你就是上帝): 世間萬物,皆可分類 世界萬物,皆為對象 https://www.cnblogs.com/alex3714/articles/5188179.html 面向對象編程 OOP編程是利用“類”和“對象”來創建各種模型來實現對真實世界的描述,使用面向對象編程的原因一方面是因為它可以 ...
  • 構建乘積數組給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。 1. 這題的意思是 B數組的元素是A數組中所有元素的乘積,但是要排除掉當前元素2. ...
  • 前言 在 "上一篇" 中我們學習了結構型模式的組合模式和過濾器模式。本篇則來學習下結構型模式最後的兩個模式, 享元模式和代理模式。 享元模式 簡介 享元模式主要用於減少創建對象的數量,以減少記憶體占用和提高性能。這種類型的設計模式屬於結構型模式,它提供了減少對象數量從而改善應用所需的對象結構的方式。 ...
  • 斷點調試的作用: A:查看程式的執行流程。 B:調試程式。 i變數只在for迴圈內有效,for迴圈結束後,變數i就消失了。 註意:要想看被調用方法的執行流程,那麼被調用方法也必須要加斷點。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...