shiyujun / syj-ratelimit Goto Github PK
View Code? Open in Web Editor NEW无侵入的应用级网关限流框架,无需配置文件,细粒度控制,高灵活性,高可用性,使用redis+lua脚本实现。
无侵入的应用级网关限流框架,无需配置文件,细粒度控制,高灵活性,高可用性,使用redis+lua脚本实现。
生产环境的redis一般为集群部署的,建议修改为可适用于集群部署。
当集群部署的时候lua脚本参数的所有key和脚本里面的key需要具有相同的slot,以使所有命令都分发到同一个redis服务器上以保证原子性,否则会导致限流失败。
我下载到源码后 必须在rateLimiter这个变量上加@Autowired这个注解才能注册进去值 否则 打印出来rateLimiter为空
是我的环境的问题?还是框架有问题呢?
如果有将syj-ratelimit用于生产环境的朋友们,请在此留下足迹(项目名or公司名),便于宣传。谢谢啦!
if diff > interval
经过测试发现,在令牌通算法并发情况下,接口耗时1秒,并发20,设置令牌刷新时间1秒,令牌数量20,如果第一秒花光令牌,那么第二秒的时候请求过来diff
应该是1,但是interval
也是1,所以在这一秒中,所有的请求都无法拿到令牌
2018-10-23 22:09:49.105 INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:49.196 INFO 4776 --- [nio-8080-exec-7] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:49.289 INFO 4776 --- [nio-8080-exec-9] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:49.379 INFO 4776 --- [nio-8080-exec-1] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:49.472 INFO 4776 --- [nio-8080-exec-2] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:49.562 INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:49.653 INFO 4776 --- [nio-8080-exec-7] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:49.745 INFO 4776 --- [nio-8080-exec-9] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:49.834 INFO 4776 --- [nio-8080-exec-1] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:49.925 INFO 4776 --- [nio-8080-exec-2] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:50.015 INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:09:56.453 INFO 4776 --- [nio-8080-exec-7] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:56.543 INFO 4776 --- [nio-8080-exec-9] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:56.638 INFO 4776 --- [nio-8080-exec-1] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:56.727 INFO 4776 --- [nio-8080-exec-2] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:56.816 INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:56.909 INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:56.999 INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:09:57.091 INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:09:57.184 INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:09:57.278 INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:09:57.363 INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:10:02.827 INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:10:02.921 INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:10:03.008 INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:10:03.103 INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:10:03.191 INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:10:03.288 INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:10:03.377 INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:10:03.471 INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:10:03.557 INFO 4776 --- [nio-8080-exec-1] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:10:03.649 INFO 4776 --- [nio-8080-exec-2] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:10:03.737 INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:11:21.022 INFO 4776 --- [nio-8080-exec-7] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:21.113 INFO 4776 --- [nio-8080-exec-9] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:21.204 INFO 4776 --- [nio-8080-exec-1] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:21.296 INFO 4776 --- [nio-8080-exec-2] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:21.386 INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:21.475 INFO 4776 --- [nio-8080-exec-7] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:21.569 INFO 4776 --- [nio-8080-exec-9] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:21.656 INFO 4776 --- [nio-8080-exec-1] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:21.752 INFO 4776 --- [nio-8080-exec-2] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:21.839 INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:21.934 INFO 4776 --- [nio-8080-exec-7] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:11:39.641 INFO 4776 --- [nio-8080-exec-9] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:39.733 INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:39.825 INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:39.921 INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:40.013 INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:40.099 INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:40.190 INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:40.279 INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:40.372 INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:40.465 INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:40.555 INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:11:51.639 INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:51.728 INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:51.824 INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:51.911 INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:52.005 INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:52.096 INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:52.188 INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:52.280 INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:52.374 INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:52.459 INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:52.554 INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:11:58.030 INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:58.121 INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:58.213 INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:58.304 INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:58.394 INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:58.488 INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:58.580 INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController : token-bucket result=1
2018-10-23 22:11:58.671 INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:11:58.762 INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:11:58.854 INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
2018-10-23 22:11:58.941 INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController : token-bucket result=-1
11个线程跑的,最后一次跑的有些不对,
单位时间是s,会不会有误差
计算令牌数的时候需要取整,否则lua脚本里面的数值计算都是浮点计算,会导致令牌数出现小数,从而redis执行减一的时候报错。
需要修改的代码行
local maxValue = value+diff/intervalstep;
修改为:
local maxValue = math.floor(value+diff/intervalstep);
会报错的代码行
redis.call('DECR',key);
local key = KEYS[1];
local limit = tonumber(string.sub(KEYS[2],1,string.len(KEYS[2])-5));
local step = tonumber(string.sub(KEYS[3],1,string.len(KEYS[3])-5));
local interval = tonumber(string.sub(KEYS[4],1,string.len(KEYS[4])-5));
local nowTime=tonumber(string.sub(KEYS[5],1,string.len(KEYS[5])-5));
local lastClearTimeKey='syj-rateLimiter-lastClearTime'..key
local lastClearTime=redis.call('GET',lastClearTimeKey);
local hasKey = redis.call('EXISTS',key);
代码中KEYS[2]到KEYS[5]应作为ARGV传递,无需设置hashTag. 而key和lastClearTimeKey是两个key,应该设置同一个hashTag(猜测,条件限制未测试).求大佬解惑
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.