Skip to main content
Version: Next

Rate Limiting

用途說明#

可限制在一段時間內通過的請求數,可以設定秒、分、時、日、月或是年。如果開啟此插件之服務或是路由沒有開啟其它驗證類的插件,則客戶端IP地址會被使用;反之,則會使用用戶資訊。

欄位配置說明#

變數類型預設值說明必填
secondnumber每一秒可通過請求數量。V
minutenumber每一分鐘可通過請求數量。V
hournumber每一小時可通過請求數量。V
daynumber每一日可通過請求數量。V
monthnumber每一個月可通過請求數量。V
yearnumber每一年可通過請求數量。V
limit_bystringconsumer用來統計限額的實體,可為 consumercredentialipserviceheaderpath。如選擇的實體無法確認其值,則系統會自動選擇 ip
service_idstringlimit_by 設定為 service 時,需填入service id。V
header_namestringlimit_by 設定為 header 時,需填入標頭名。V
pathstringlimit_by 設定為 path 時,需填入路徑。V
policystringcluster用來計算限額的方針,可選擇的選項有:
* local: 計算機會儲存在節點內的本地的記憶體
* cluster: 計算機儲存在datastore並且分享給不同節點
* redis:計算機儲存在Redis伺服器上並且分享給不同節點
fault_tolerantbooleantrue當連線至第三方之datastore有問題時決定是否被代理。當設定為 true 時,請求會被代理,並且速率限制之功能會被關閉直到datastore恢復運作。如設定為 false ,客戶端會直接收到 500 的錯誤回應。
hide_client_headersbooleanfalse是否在回應時隱藏rate limit相關資訊之標頭。
redis_hoststring當使用 redis 方針時,需填入Redis伺服器位置。V
redis_portinterger6379當使用 redis 方針時,需填入Redis伺服器通訊埠。
redis_passwordstring當使用 redis 方針時,需填入連線至Redis伺服器之密碼。
redis_timeoutnumber2000當使用 redis 方針時,需填入傳送任何請求至Redis伺服器之可接受連線時間,單位為 豪秒 (milliseconds)。
redis_databaseinterger0當使用 redis 方針時,需填入Redis使用之資料庫。
note

secondminutehourdaymonthyear必須填入其中至少一項,也可同時填入多項。

用法示例#

在全局啟用插件#

  1. 從網站左邊Menu中 外掛插件 頁面中,點選右上角的 新增外掛插件

全局啟用畫面

  1. 點選後,選擇 流量控管 頁籤,並啟用Rate Limiting,填寫內容參考欄位配置說明,設定成功後,任何請求(不分服務、路由、用戶)皆需經過計算才能通過。

在服務端上啟用插件#

  1. 從網站左邊Menu中 服務 > 服務列表 頁面中,選擇要啟用此插件的服務,假設為google,點選對應的編輯按鈕:

服務啟用畫面1

  1. 在編輯畫面中,點選上方的 外掛插件 頁籤,再點選頁籤內容上方的 新增外掛插件 按鈕:

服務啟用畫面2

點選後,選擇 流量控管 頁籤,並啟用Rate Limiting,填寫內容參考欄位配置說明,設定成功後,僅有此服務(範例為google)請求需經過計算才能通過。

在路由端上啟用插件#

可以由兩種方式來選擇路由,並啟用插件:

方式一:路由列表#

  1. 從網站左邊Menu中 服務 > 路由列表 頁面中,選擇要啟用此插件的路由,假設為google,點選對應的編輯按鈕:

路由啟用畫面1

方式二:服務 > 服務列表 > 路由列表#

  1. 從網站左邊Menu中 服務 > 服務列表 頁面中,選擇要啟用此插件的路由 所屬之服務(假設為google),點選對應的編輯按鈕。

在編輯畫面中,點選上方的 路由 頁籤,選擇要啟用此插件的路由(假設為google),點選對應的編輯按鈕:

路由啟用畫面2


  1. 承第1步,點擊上述兩種方式之一的編輯按鈕後,在編輯畫面中,點選上方的 外掛插件 頁籤,再點選頁籤內容上方的 新增外掛插件 按鈕:

路由啟用畫面3

點選新增外掛插件 按鈕後,選擇 流量控管 頁籤,並啟用Rate Limiting,填寫內容參考欄位配置說明,設定成功後,僅有此路由(範例為google)請求需經過計算才能通過。

在用戶端上啟用插件#

  1. 從網站左邊Menu中 訂閱用戶 > 用戶列表 頁面中,選擇要啟用此插件的用戶,假設為portaladmin,點選對應的編輯按鈕 :

用戶啟用畫面1

  1. 在編輯畫面中,點選上方的 外掛插件 頁籤,再點選頁籤內容上方的 新增外掛插件 按鈕:

用戶啟用畫面2

點選後,選擇 流量控管 頁籤,並啟用Rate Limiting,填寫內容參考欄位配置說明,設定成功後,僅有此用戶(範例為portaladmin)請求需經過計算才能通過。

驗證#

當開啟此插件時,如請求已達到設定數量時,會取得下列回應

HTTP/1.1 429 Too Many Requests
Date: Tue, 06 Apr 2021 08:12:52 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
X-RateLimit-Remaining-Minute: 0
X-RateLimit-Limit-Minute: 2
RateLimit-Remaining: 0
Retry-After: 8
RateLimit-Limit: 2
RateLimit-Reset: 8
Content-Length: 41
X-Kong-Response-Latency: 3
Server: kong/2.3.3
{
"message":"API rate limit exceeded"
}

三種方針比較#

方針優點缺點
cluster精準,不需準備其它工具相較之下有最大的性能影響,每個請求都會對datastore做讀/寫動作
redis精準,相較 cluster 有較低的性能影響需要額外安裝redis,以及比起 local 方針有較大的性能影響
local最小的性能影響較不精準。如擴增使用的節點時,除非使用consistent-hashing load balancer,否則資料會有誤差

兩種普遍的使用情形#

  1. every transaction counts
    當處理較為重要之行為,例如金融系統上的交易則需要非常精準的計算

  2. backend protection
    對於精準度沒有那麼高需求,主要目地是要避免後端發生超載的情況。或是避免特定使用者對後端做出攻擊行為。