天天看點

建構高可用雲原生應用,如何有效進行流量管理?

作者:華為雲開發者聯盟

本文分享自華為雲社群《建構高可用雲原生應用,如何有效進行流量管理?-雲社群-華為雲》,作者: breakDawn。

随着雲原生的概念越來越火,服務的架構應該如何發展和演進,成為很多程式員關心的話題。大名鼎鼎的《深入了解java虛拟機》一書作者于21年推出了新作《鳳凰架構》,從這本書中可以看到目前時下很多最新的技術或者理念。

建構高可用雲原生應用,如何有效進行流量管理?

是以本文以及後續都将持續沉澱釋出這本書的學習筆記和思考,也歡迎購買該書進行詳細學習,或者關注後續的學習筆記内容釋出,了解精華内容和總結思考。

流量治理

1 服務容錯

1.1 容錯政策

文章中介紹了故障轉移、快速失敗、安全失敗、沉默失敗、故障恢複、并行調用、廣播調用等幾種容錯政策,我用表格的形式直覺呈現一下這幾種政策的差別,友善了解和選型:

建構高可用雲原生應用,如何有效進行流量管理?

1.2 容錯設計模式

1.斷路器模式

即服務中發請求的地方都通過一個斷路器子產品來轉發發送

當10秒内請求數量達到20,且失敗門檻值達到50%以上(這些參數都可以調整), 則認為出現問題, 于是主動進行服務熔斷, 斷路器收到的請求自動傳回錯誤,不再去調用遠端服務, 這樣可避免請求線程各種阻塞,能及時傳回報錯。

中間會保持有間隔的重試直到恢複後,關閉斷路。

2.艙壁隔離模式

如果一個服務中,可能要同時調用A\B\C三個服務,但是卻共用一個線程池。

如果調用C服務逾時,而調用C的請求源源不斷打來,會造成C服務的請求線程全在阻塞,直接把整體線程池給占滿了,影響了對A\B服務的調用。

一種隔離措施是對每個調用服務分别維護一個線程池。缺點是額外增加了排隊、排程、上下文切換的開銷,據說Hystrix線程池如果開啟了服務隔離,會增加3~10ms的延遲。

另一種隔離措施是直接自己定義三個服務的計數器,當服務線程數量到達門檻值,自動對這個服務調用做限流。

3.重試模式

故障轉移和故障恢複這2個政策一般都是借助重試模式來處理的,進行重複調用。

重試模式應該滿足以下條件才能使用:

  • 僅在主路核心邏輯的關鍵服務上進行同步的重試, 而非關鍵的服務
  • 隻對瞬時故障進行重試,對于業務故障不進行重試
  • 隻對幂等型的服務進行重試

重試模式應該有明确的終止條件,例如:

  • 逾時終止
  • 次數終止

重試一定要謹慎開啟, 有時候在網關、負載均衡器裡也會配置一些預設的重試, 一旦鍊路很長且都有重試,那麼系統中重試的次數将會大大增加。

2 流量控制

流量控制需要解決以下3個問題

  • 依據什麼名額來限流
  • 如何限流
  • 超額流量如何處理

2.1 流量統計名額(依據什麼名額來限流)

  • 每秒事務數TPS: 事務是業務邏輯上具有原子操作的業務操作,對于對買書接口而言, 買書就是一個事務, 背後的其他請求是不感覺的。
  • 每秒請求數HPS: 就是系統每秒處理的請求數, 如果1事務中隻有1個請求, 那麼TPS=HPS, 否則HPS>TPS
  • 每秒查詢書QPS: 是一台伺服器能夠響應的查詢次數。 對于單節點系統而言,QPS=HPS,對于一個分布式系統而言HPS>TPS

通過限制最大TPS來限流的話,不能夠準确反映出系統的壓力, 是以主流系統傾向使用HPS作為首選的限流名額。

2.2 限流設計模式(如何限流)

流量計數器模式

統計每秒内的請求數是否大于門檻值

缺點:

  1. 每秒是基于1.0s-2.0這樣的區間統計, 但如果是0.5-1.5 和1.5-2.5分别超出門檻值,但是1.0-2.0沒有超過門檻值,則會出現問題。
  2. 每秒的請求超過門檻值,也不代表系統就真的承受不住,導緻五殺

滑動時間窗模式

滑動時間窗專門解決了流量計數器模式的缺點。

準備一個長度為10的數組,每秒觸發1次的定時器

①将數組最後一位的元素丢棄,并把所有元素都後移一位,然後在數組的第一位插入一個新的空元素

②将計數器中所有的統計資訊寫入第一位的空元素

③對數組中所有元素做統計,清空計數器資料

可以保證在任意時間片段内,隻通過簡單的調用計數比較, 控制請求次數不超過門檻值

缺點在于隻能用于否決式限流, 必須強制失敗或者降級,無法進行阻塞等待的處理。

漏桶模式

漏桶和令牌桶可以适用于阻塞等待的限流。

漏桶就是一個以請求對象作為元素的先入先出隊, 隊列程度等于漏桶大小,當隊列已滿拒絕信的請求進入。

比較困難的原因在于很難确定通的大小和水的流出速度,調參難度很大。

令牌桶模式

每隔一定時間,往桶裡放入令牌,最多可以放X個

每次請求消耗掉一個。

可以不依賴定時器實作令牌的放入,而是根據時間戳,在取令牌的時候當發現時間戳滿足條件則在那個時候放入令牌即可

2.3 分布式限流

前面的4個限流模式都隻是單機限流,經常放在網關入口處,不适用于整個服務叢集的複雜情況,例如有的服務消耗多有的服務消耗少,都放在入口處限流情況其實很多。

可以基于令牌桶的基礎上,在入口網關處給不同服務加不同的消耗令牌權重,達到分布式叢集限流的目的

總結

流量治理技術對雲原生場景的重要性

以上主要介紹了服務容錯和容錯設計模式,涉及到不同的容錯政策和容錯設計模式,如故障轉移、快速失敗、安全失敗、沉默失敗、故障恢複、并行調用和廣播調用。

這2個設計可以保證系統的穩定性和健壯性。這篇文章涉及的話題與雲原生服務息息相關,因為雲原生應用程式之間會頻繁通過進行請求和互動,需要通過容錯和彈性來保證高可用性。

是以,對于那些希望使用華為雲的雲原生服務的人來說,這篇文章提供了很好的指導,讓他們了解如何通過容錯來保證他們的服務的可用性和穩定性。

華為雲如何在流量治理中展現作用

如果能通過将服務API注冊到華為雲提供的APIG網關上,似乎能夠很友善地達成上述2個設計。

比如APIG支援斷路器政策,是API網關在後端服務出現性能問題時保護系統的内置機制。當API的後端服務出現連續N次逾時或者時延較高的情況下,會觸發斷路器的降級機制,向API調用方傳回固定錯誤或者将請求轉發到指定的降級後端。當後端服務恢複正常後,斷路器關閉,請求恢複正常。APIG-斷路器政策(https://support.huaweicloud.com/usermanual-apig/apig_03_0023.html)

同時APIG還提供了流量控制政策,支援從使用者、憑據和時間段等不同的次元限制對API的調用次數,保護後端服務。支援按分/按秒粒度級别的流量控制,閱讀了上文中提到的幾個流量政策,再去看APIG裡配置的流量政策值,則會很容易了解。APIG-流量控制政策(https://support.huaweicloud.com/usermanual-apig/apig_03_0025.html)

建構高可用雲原生應用,如何有效進行流量管理?

可以看到對于這些常見的經典服務設計政策,無需再重複造輪子,使用已有雲服務,可以很快地實作相關功能,提升産品的上線速度和疊代效率。

關注#華為雲開發者聯盟# 點選下方,第一時間了解華為雲新鮮技術~

華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲

繼續閱讀