我們熟悉的限流演算法漏桶和令牌桶外,很多情況我們還需要考慮當個使用者(ip)訪問頻率控制,避免被惡意呼叫。如果是開放平台限制一天呼叫多少次這種粗放的粒度相對好處理一些。如果需要更小時間粒度控制,譬如乙個10秒時間視窗最大只允許訪問10次,相對上述粗放粒度我們還需要考慮效能和邊界兩個問題。在這裡提供一種思路給大家,這個也是我寫的api閘道器訪問頻率控制的**,經過了線上環境實踐。推薦:,jeesuite開發框架免費開源、一站式解決方案。
思路(以10秒限制10次為例)
定義乙個全域性map
cleanscheduledexecutor.scheduleatfixedrate(new runnable()
}cleannulling =
false;
}idsiterator = accessdatas.keyset().iterator();
gloabalscanflag =
0; } else
while (idsiterator.hasnext())
}},1000, 1000, timeunit.milliseconds);
移除過期的請求時間戳記錄
private
intremoveexpirepoints(listponits,long currenttimemillis)
iteratorpointsiterator = ponits.iterator();
while (pointsiterator.hasnext()) else
} return removenums;
}
頻控檢查
/**
* 訪問頻率檢查
*@param identification 使用者標識(ip or sessionid)
*@param uri
*@return
*/private
boolean
requestfrequencycheck(string identification, string uri)
int size;
if ((size = accesspoints.size()) < permits)
result = true;
} else
return result;
} finally
}
C 站點IP訪問頻率限制 針對單個站點
站點ip訪問頻率限制 針對單個站點 using system using system.collections.generic using system.io using system.linq using system.web ip訪問頻率控制 public static class ipcach...
Django 限制使用者訪問頻率
import time from django.utils.deprecation import middlewaremixin max request per second 2 每秒訪問次數 class requestblockingmiddleware middlewaremixin def p...
nginx新增ip訪問頻率限制
使用limit req zone和limit req指令配合使用來達到限制。一旦併發連線超過指定數量,就會返回503錯誤。定義乙個名為allips的limit req zone用來儲存session,大小是10m記憶體,以 binary remote addr 為key,限制平均每秒的請求為20個,...