原文 : https://blog.eood.cn/rate-limiting
總結:
nginx中的處理:
參考網頁:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
vi /export/servers/nginx/conf/nginx.conf limit_zone one $binary_remote_addr 20m; limit_req_zone $binary_remote_addr zone=req_one:20m rate=12r/s; limit_conn one 10; limit_req zone=req_one burst=120;
來看下具體含義: burst : 漏桶數burst爲5,如果第1秒、2,3,4秒請求爲19個,第5秒的請求爲25個是被允許的。 但是如果你第1秒就25個請求,第2秒超過20的請求返回503錯誤。 limit_zone,是針對每個變量(這裏指IP,即$binary_remote_addr)定義 一個存儲session狀態的容器。這個示例中定義了一個20m的容器, 按照32bytes/session,可以處理640000個session。 ( 已經被棄用,請用limit_conn_zone替換) limit_req_zone 與limit_zone類似。rate是請求頻率. 每秒允許12個請求。 limit_conn one 10 : 表示一個IP能發起10個併發連接數limit_req: 與limit_req_zone對應。
2. java中,
使用Google Guava 提供了一個 RateLimiter 實現
final RateLimiter rateLimiter = RateLimiter.create(2.0); // rate is "2 permits per second" void submitTasks(List<Runnable> tasks, Executor executor) { for (Runnable task : tasks) { rateLimiter.acquire(); // may wait executor.execute(task); } }
3. redis :
參考網頁: http://redis.io/commands/INCR#pattern-rate-limiter
jedis中有incr和expire的api
擴展:
nginx白名單配置:
http://colobu.com/2015/10/26/nginx-limit-modules/