我想找到一个可以执行“流控制”的功能数据结构。
示例:对于任何访问我的IP的IP,如果该IP自M分钟前以来已访问> = N次,则该IP被限制访问Z分钟。
是否有不需要计时器(定期删除访问记录)或大型数据存储(记住所有IP的所有访问)的解决方案?
可以使用JAVA或Scala构造数据结构。
答案 0 :(得分:1)
简单的答案是是,否和是。
是,您无需计时器即可完成操作,只需要一个时钟。当请求到达时,您会按时查看时钟并根据历史数据决定是否根据您的算法拒绝请求。
否,如果不为每个IP记录多达N个访问记录,就无法做到这一点。您需要知道每个请求的时间,以了解最近M分钟内发生了多少次。有多种压缩方法,但是如果不记录每次访问,就无法实现算法。
是,您可以使用Java或Scala根据您的算法创建适当的数据结构。
但是,如果您修改测试,则可以减少数据存储。例如,您可以将时间划分为长度为M的窗口,并在每个窗口中计算请求数。如果当前和先前窗口中的请求数超过N,则您拒绝该请求。这不会产生完全相同的结果,但可以实现对活动过度的客户端进行限速请求的总体目标,同时每个IP地址仅存储两个值。