nginxゲートウェイ限流の1つのバケツ漏れアルゴリズムを実現
1261 ワード
リークバケツアルゴリズム(Leaky Bucket)は、ネットワークの世界でトラフィック整形(Traffic Shaping)やレート制限(Rate Limiting)の際によく使われるアルゴリズムで、データがネットワークに注入されるレートを制御し、ネットワーク上のバーストトラフィックをスムーズにすることを主な目的としている.リークバケツアルゴリズムは、バーストトラフィックをネットワークに安定なトラフィックを提供するために整形することができる機構を提供する.
単純な点は、ドレインバケツは、一定のサービス時間を有する単一サーバキューと見なすことができ、ドレインバケツ(パケットキャッシュ)がオーバーフローすると、パケットは破棄される.
1 ngx_http_limit_req_モジュールモジュール
紹介する
nginxが持参したngx_http_limit_req_moduleモジュールは、要求をストリーム制限すること、すなわち、ある期間のユーザの要求レートを制限することである.バケツ漏れアルゴリズムが使用されています.
ユーザが要求すると、クライアントIPアドレス($binary_remote_addrを構成)のhash値をkeyとして赤と黒のツリーに格納する(クイック検索)アクセスレコードが追加され、LRUキューに格納される(記憶領域が足りない場合、レコードが淘汰され、毎回末尾から削除される).ユーザーが再び要求すると、赤と黒のツリーからこのレコードが検索され、更新され、同時にLRUキューのヘッダにレコードが移動します.
アクセスレコードの構造体typedef struct{u_char color;u_char dummy;u_short len;//データ長ngx_queue_t queue;ngx_msec_t last;//前回アクセス時間ngx_uint_t excess;//現在の残りの処理されるリクエスト数(nginxはこの実装トークンバケツストリーム制限アルゴリズム)ngx_uint_t count;//このようなレコードリクエストの合計u_char data[1];//データコンテンツ(key(hash値)で検索し、データコンテンツが等しいかどうかを比較する)
}
2使用
単純な点は、ドレインバケツは、一定のサービス時間を有する単一サーバキューと見なすことができ、ドレインバケツ(パケットキャッシュ)がオーバーフローすると、パケットは破棄される.
1 ngx_http_limit_req_モジュールモジュール
紹介する
nginxが持参したngx_http_limit_req_moduleモジュールは、要求をストリーム制限すること、すなわち、ある期間のユーザの要求レートを制限することである.バケツ漏れアルゴリズムが使用されています.
ユーザが要求すると、クライアントIPアドレス($binary_remote_addrを構成)のhash値をkeyとして赤と黒のツリーに格納する(クイック検索)アクセスレコードが追加され、LRUキューに格納される(記憶領域が足りない場合、レコードが淘汰され、毎回末尾から削除される).ユーザーが再び要求すると、赤と黒のツリーからこのレコードが検索され、更新され、同時にLRUキューのヘッダにレコードが移動します.
アクセスレコードの構造体typedef struct{u_char color;u_char dummy;u_short len;//データ長ngx_queue_t queue;ngx_msec_t last;//前回アクセス時間ngx_uint_t excess;//現在の残りの処理されるリクエスト数(nginxはこの実装トークンバケツストリーム制限アルゴリズム)ngx_uint_t count;//このようなレコードリクエストの合計u_char data[1];//データコンテンツ(key(hash値)で検索し、データコンテンツが等しいかどうかを比較する)
}
2使用
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location /search/ {
limit_req zone=one burst=5;
}