虽然是限制频次,更多的是和业务代码结合的问题
现在的需求是一次请求进入之后,只读取一次(或者是一个常量不会根据下游服务的增多而增多)redis 数据,来论坛寻求帮助,看有没有好的解决方案
现在的服务情况是: 一个 tomcat 集群中,控制频次按用户 id 去限制,一次请求就是一个用户,可以有多个限制频次的任务
一个请求进入 tomcat 后,之后会同时发送比如三次请求(三个线程)给不同的下游服务,限制频次是针对不同的下游服务,可能有两个个下游限制了频次,也可能是一个
之前的条件比如会有 qps 限制,需要等到过滤条件走到限制频次的代码才知道需不需要限制频次,把读取 redis 尽可能往后放,减少读取 redis 的次数
还有一个问题是 redis 里边不光只有频次限制,还有一些别的数据,可能在频次限制之前或者之后使用
我目前想到的解决方案是:
这里的用户频次限制是针对用户id+任务id
然后就是我们只有tomcat,不是微服务..
![]() | 1 infoscope 326 天前 via iPhone 这样坐为了解决什么问题 |
![]() | 2 memorycancel 326 天前 我理解 tomcat 应该是总入口,如果是为了限制业务,那么应该把 redis 读取模块放到应用层 application ,在应用层写一个模块,而不是 tomcat 。 |
![]() | 3 magicZ 326 天前 |
4 cJ8SxGOWRH0LSelC 326 天前 你这个需求和方案就相当于实现一个中间件把 redis 封装了一层, 对 redis 的请求进行过滤和拦截。 但是这个专门读取 redis 的服务不就成了一个新的“Redis”了吗? 依然存在资源访问瓶颈, 那还不如直接去读 Redis 。 |
![]() | 5 itechify PRO |
![]() | 6 xuanbg 326 天前 直接网关限流不行吗?限流策略有: 1 、限制访问间隔时间,譬如每次访问必须间隔 3 秒。这个可以有效防刷。 2 、设定时间窗口内限制访问次数,如每小时 300 次,从第一次访问开始计时,300 次满就必须要等计时满 1 小时后次数清零。 3 、以上两个结合,这样虽然是每 3 秒可以访问一次,但每小时上限只有 300 次而非 1200 次。 |
![]() | 8 chenfang OP @oneisall8955 集群控制 QPS 那个跟现在 redis 控制用户频次不是一个问题 集群控制 QPS 的解决方案基于请求量大概率是比较平稳的所以只用了一个百分比来过滤请求,动态调整百分比大小基本就可以实现,这种性能影响最小,结论就是能用 |
![]() | 9 realpg PRO 你需要做的是把你的需求说明白 而不是把你最开始帖子的内容隔一阵子就重新发一遍 你的四个帖子我都看过 表达能力堪忧 |
![]() | 12 codespots 325 天前 我觉得你遇到了 X-Y 问题,而不是具体的方案设计问题 |
![]() | 13 chenfang OP @caryqy 我们一天的请求是 250 亿左右,换算 qps 为:31 万,不是所有都会请求 redis,按一半的话 15W*(3 或者 4)=45W,虽然现在是集群,但是这个数量也不少了 |
![]() | 15 monmon 325 天前 我猜你在找的是 Redisson RRateLimiter 这里有个封装好的,稍微改造一下应该就可以满足你的需求 https://github.com/dromara/RuoYi-Vue-Plus/tree/5.X/ruoyi-common/ruoyi-common-ratelimiter |