限流主要是針對非核心服務調用者進行的。
1、確定限流對象
原則上,大促核心鏈路上的服務都要配置限流,以免大促期間的流量超過預估值把服務器壓垮。
同時還要考慮出口限流,主要是對db的限流,配置一個讀寫總流,以避免把服務器壓垮。
2、確定限流實現方式
限流實現方式主要有兩種:
- 對Facade包中inteface的方法配置限流
- 定義一個專門的service,這個service中的一個方法是就是一個限流內容。需要限流的服務內引入這個service,而後對這個service中的方法配置限流
方法1的好處是簡單,缺點是限流配置可能會分散到多個文件甚至bundle中。
方法2的好處是集中管理,缺點是需要限流的服務要專門引入一個新的serivce,以後每加一個限流內容這個servcie都要進行下修改。
兩種方法各有優劣,各個系統可根據自己的業務特點進行配置。
3、確定限流超量處理策略
限流處理的超量處理總體來說有兩種策略:
- 不做處理
- 執行指定的動作:拋異常、跳轉到指定頁面、返回json或xml格式的報文
這兩種策略的使用場景主要如下:
- 對於供用戶直接訪問的網頁,最好直接跳轉到指定頁面,告知用戶稍後再試;
- 對於ajax接口,可以返回json或xml格式的報文,客戶端解析後使得用戶有一個比較好的用戶體驗;
- 對於上游弱依賴的服務端服務,可以不做處理;但是對於強依賴的服務,最好拋出異常,而後在自己系統內部catch住該異常,再返回一個默認結果給到上游系統;或者自己系統內部可以有一個稍微複雜的設計,對異常進行統計,大於一定範圍後可以自動進行熔斷。
總體而言,超量之後執行指定動作要好於不做處理。
4、限流驗證
配置完成後,就需要進行驗證了,驗證的方式主要是看日誌,通過日誌看
- 限流有沒有生效
- 限流生效後有沒有執行指定的動作
- 有沒有誤攔
通常而言,我們配置的限流值要比日常的流量值大好幾倍的,正常情況下不會觸發限流的,因而要觸發限流通常有兩種方法:
- 在開發或sit環境調小限流值
- 在線上或者預發環境進行壓測
5、限流攔截監控
通過查看日誌可以知道單機的限流攔截情況,但是一個系統通過會部署上百臺服務器,如果要了解整個系統的攔截情況,手工一臺臺查看而後相加的方式顯示是不可取的。
在支付寶中強大的xflush,因而可以利用xflush配置對應的監控,通過監控一目瞭然瞭解整個集羣的限流情況,主要是配置三個數據:
- 限流總量
- 請求總量
- 攔截總量
然後把這個數據配置到一張報表中,這樣就可以方便的在一張報表中瞭解系統整體限流情況。