新浪微博的一名工程師正在家裏辦婚禮,忽然接到公司緊急電話處理線上流量激增的問題,由於某當紅明星公佈了戀情,致使流量增長好多倍,而後系統出現不穩定,用戶訪問不順暢。工程師沒辦法只能婚禮現場穿着西裝打開筆記本調試代碼。此時更意識到系統擴容和限流機制是多麼重要啊。前端
相似現實生活中的景區限流,系統也要有對應的限流措施。算法
對系統服務進行限流,通常有以下幾個模式:數據庫
-
熔斷:
這個模式是須要系統在設計之初,就要把熔斷措施考慮進去。當系統出現問題時,若是短期內沒法修復,系統要自動作出判斷,開啓熔斷開關,拒絕流量訪問,避免大流量對後端的過載請求。系統也應該可以動態監測後端程序的修復狀況,當程序已恢復穩定時,能夠關閉熔斷開關,恢復正常服務。後端 -
服務降級:
將系統的全部功能服務進行一個分級,當系統出現問題,須要緊急限流時,可將不是那麼重要的功能進行降級處理,中止服務,這樣能夠釋放出更多的資源供給核心功能的去用。
例如在電商平臺中,若是突發流量激增,可臨時將商品評論、積分等非核心功能進行降級,中止這些服務,釋放出機器和CPU等資源來保障用戶正常下單,而這些降級的功能服務能夠等整個系統恢復正常後,再來啓動,進行補單/補償處理。
除了功能降級之外,還能夠採用不直接操做數據庫,而所有讀緩存、寫緩存的方式做爲臨時降級方案。緩存 -
延遲處理:
這個模式須要在系統的前端設置一個流量緩衝池,將全部的請求所有緩衝進這個池子,不當即處理。而後後端真正的業務處理程序從這個池子中取出請求依次處理,常見的能夠用隊列模式來實現。這就至關於用異步的方式去減小了後端的處理壓力,可是當流量較大時,後端的處理能力有限,緩衝池裏的請求可能處理不及時,會有必定程度延遲。性能優化 -
特權處理:
這個模式須要將用戶進行分類,經過預設的分類,讓系統優先處理須要高保障的用戶羣體,其它用戶羣的請求就會延遲處理或者直接不處理。異步
那在實際項目中,對訪問流量的限制,可採用以下幾種技術方法:性能
-
熔斷技術
熔斷的技術能夠重點參考Netflix的開源組件hystrix的作法,主要有三個模塊:熔斷請求判斷算法、熔斷恢復機制、熔斷報警。優化 -
計數器方法
系統維護一個計數器,來一個請求就加1,請求處理完成就減1,當計數器大於指定的閾值,就拒絕新的請求。
基於這個簡單的方法,能夠再延伸出一些高級功能,好比閾值能夠不是固定值,是動態調整的。另外,還能夠有多組計數器分別管理不一樣的服務,以保證互不影響等。spa -
隊列方法
就是基於FIFO隊列,全部請求都進入隊列,後端程序從隊列中取出待處理的請求依次處理。
基於隊列的方法,也能夠延伸出更多的玩法來,好比能夠設置多個隊列以配置不一樣的優先級。 -
令牌桶方法
首先仍是要基於一個隊列,請求放到隊列裏面。但除了隊列之外,還要設置一個令牌桶,另外有一個腳本以持續恆定的速度往令牌桶裏面放令牌,後端處理程序每處理一個請求就必須從桶裏拿出一個令牌,若是令牌拿完了,那就不能處理請求了。咱們能夠控制腳本放令牌的速度來達到控制後端處理的速度,以實現動態流控。
咱們在作服務限流的時候,仍是有一些原則和事項須要注意的:
-
實時監控:系統必需要作好全鏈路的實時監控,才能保證限流的及時檢測和處理。
-
手動開關:除系統自動限流之外,還須要有能手動控制的開關,以保證隨時均可以人工介入。
-
限流的性能:限流的功能理論上是會在必定程度影響到業務正常性能的,所以須要作到限流的性能優化和控制。
系統故障經常都是不可預測且難以免的,所以做爲系統設計師的咱們,必需要提早預設各類措施,以應對隨時可能的系統風險。
Original 不止思考的技術 不止思考