虽然是限制频次,更多的是和业务代码结合的问题
现在的需求是一次请求进入之后,只读取一次(或者是一个常量不会根据下游服务的增多而增多)redis 数据,来论坛寻求帮助,看有没有好的解决方案
现在的服务情况是:
一个 tomcat 集群中,控制频次按用户 id 去限制,一次请求就是一个用户,可以有多个限制频次的任务
一个请求进入 tomcat 后,之后会同时发送比如三次请求(三个线程)给不同的下游服务,限制频次是针对不同的下游服务,可能有两个个下游限制了频次,也可能是一个
之前的条件比如会有 qps 限制,需要等到过滤条件走到限制频次的代码才知道需不需要限制频次,把读取 redis 尽可能往后放,减少读取 redis 的次数
还有一个问题是 redis 里边不光只有频次限制,还有一些别的数据,可能在频次限制之前或者之后使用
我目前想到的解决方案是:
- 那些不是限制频次的 key,在遇到需要读取 redis 的时候,使用 pipeline 统一读取
- 在循环过滤条件的时候,把请求 redis 的 key 存在一起,然后使用 CyclicBarrier+lua 脚本读取和写入限制频次 keys
|