問題
最近有一個文件下載的服務,下載流量很大,我們的帶寬有限,很多時候系統有很多人同時在下載文件
盡管客戶端已經做了一些斷點續傳以及重試,但是在用戶訪問量較大的時候容易出現鏈接因為帶寬問題被
關閉,造成用戶文件下載失敗次數比較多,因為文件偏大, 很多時候整個元數據塊下載不完整,造成了很差
的用戶體驗
解決
- 參考方法
因為我們的入口是基於nginx 的,所以直接使用nginx 的limit_rate指令比較靈活的,不用依賴復雜的東西 - 實踐
一般來說我們需要結合limit_conn 以及limit_req 一起使用,但是因為業務的也屬性,不能搞鏈接的限制,所以我們只能基
於業務系統統計的鏈接以及帶寬情況做一個整體的限速,流量監控我們基於prormetheus(node exporter)
+grafana,而且我們的業務有一點是系統客戶端下載的鏈接最大為兩個,這樣就是一個天然的限制鏈接,而且
我們經常看到在限流的時候可以配置limit_rate_after 但是因為我們的業務場景是文件下載,很多時候可能也有
很多小文件,所以在系統配置的時候沒有開啟(直接全部限速,減少因為小文件引起的流量突發)
參考配置
- 配置指令
很簡單,不需要復雜的,直接一個簡單的指令就可以了
limit_rate 2m;
說明
以上是結合自身業務系統的一個限流方案,很簡單,但是在進行了這個簡單的配置之后,系統的流量以及穩定性提高了好多
參考資料
http://nginx.org/en/docs/http/ngx_http_core_module.html
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html