xx通CGI流量控制

时间:2023-12-17 16:26:50
流量控制共分2步,首先在CGI框架对用户的ip作限制,第二限制每个CGI的流量。
一、基于IP的流量控制
用共享内存(shm)的方式保存基于ip的访问信息。
配置文件中 <variable name="ip_limit_default" limit_int="60" shm_key="1653" recal_int="300" max_count="600" >
shm_key是共享内存的id,limit_int是用户超过限制后的冷冻时间,recal_int是统计时间,max_count是统计时间内允许的最大请求次数。
httpd启动后,首次被访问的cgi进行shm的初始化,申请一段连续的空间并初始化为0. shm结构如下图所示:
xx通CGI流量控制
当一个请求到来时,根据用户ip做hash,我们的算法很简单,取ip地址最末一个字节,将ip散列到256个段(如上图所示),再在每个段内根据key(ip地址)进行顺序查找,查找时会统计所过结点的最小count。如果没找到,首先用空结点,其次用24小时未更新过的结点,最后用访问次数最少(即最小count的结点)。这样总会返回一个结点。
每recal_int时间对count和time重置,如果count超过了max_count就对用户冷冻limit_int时间,limit_int时间过后再将time和count重置。
这里面所有的更新都是基于用户请求的到来,系统不会根据time对shm结点做老化处理
二、基于CGI的流量控制
利用CKV的超时来统计CGI的流量。
在CKV建立两个key, LockKey用于统计时间,LimitKey用于统计次数。
LockKey会根据设置的expire时间自动过期。
每个请求到来时,取Limitkey加1,未达上限就继续访问,达到上限时要检查LockKey是否过期,如果过期则重置LimitKey并放行,未过期则限制访问。