分布式限流
分布式限流最关键的是要将限流服务做成原子化,而解决方案可以使用 Redis+Lua 或者 Nginx+Lua 技术实现,通过这两种技术可以实现高并发和高性能。本文使用 Redis+Lua 实现时间窗内某个接口的请求数限流,实现了该功能后可以改造为限流总并发/请求数和限制总资源数。
Redis+Lua实现脚本
1 2 3 4 5 6 7 8 9 10
| local key = KEYS[1] local limit = tonumber(ARGV[1]) local current = tonumber(redis.call('get',key) or "0") if current + 1 > limit then return 0 else redis.call("INCRBY",key,"1") redis.call("expire",key,"2") return 1 end
|
Java中判断是否需要限流的代码
1 2 3 4 5 6 7 8 9 10 11
| public static boolean () throws Exception { String luaScript = Files.toString(new File("xxxxLimit.lua")),Charset.defaultCharset()); String key = "ip:" + System.currentTimeMillis()/1000; String limit = "30"; return (Long)jedis.eval(luaScript,Lists.newArrayList(key),Lists.newArrayList(limit)) == 1; }
|