公司有一个需求,需要集群中的机器每分钟发送固定个数请求到局域网以外的一台服务器,固定个数,是指集群中的所有机器发送的所有的请求加起来是一个固定的个数,这就需要一个分布式的限速器。首先想到的就是使用redis中的incr方法,在redis的官方文档中寻找到了一个示例
FUNCTION LIMIT_API_CALL(ip)ts = CURRENT_UNIX_TIME()keyname = ip+":"+tscurrent = GET(keyname)IF current != NULL AND current > 10 THEN ERROR "too many requests per second"ENDIF current == NULL THEN MULTI INCR(keyname, 1) EXPIRE(keyname, 1) EXECELSE INCR(keyname, 1)ENDPERFORM_API_CALL()但这个脚本对我来说有两个缺点
1 我的限速器并不是限制一台机器的速度,而是限制整个集群的速度,所以在判断了限速的key的长度之后,会有很多的机器执行incr动作
2 公司DBA不支持使用事物