V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chenfang
V2EX  ›  程序员

再次求救 redis 用户限制频次问题

  •  
  •   chenfang · 13 天前 · 1356 次点击

    虽然是限制频次,更多的是和业务代码结合的问题

    现在的需求是一次请求进入之后,只读取一次(或者是一个常量不会根据下游服务的增多而增多)redis 数据,来论坛寻求帮助,看有没有好的解决方案

    现在的服务情况是: 一个 tomcat 集群中,控制频次按用户 id 去限制,一次请求就是一个用户,可以有多个限制频次的任务

    一个请求进入 tomcat 后,之后会同时发送比如三次请求(三个线程)给不同的下游服务,限制频次是针对不同的下游服务,可能有两个个下游限制了频次,也可能是一个

    之前的条件比如会有 qps 限制,需要等到过滤条件走到限制频次的代码才知道需不需要限制频次,把读取 redis 尽可能往后放,减少读取 redis 的次数

    还有一个问题是 redis 里边不光只有频次限制,还有一些别的数据,可能在频次限制之前或者之后使用

    我目前想到的解决方案是:

    1. 那些不是限制频次的 key,在遇到需要读取 redis 的时候,使用 pipeline 统一读取
    2. 在循环过滤条件的时候,把请求 redis 的 key 存在一起,然后使用 CyclicBarrier+lua 脚本读取和写入限制频次 keys
    第 1 条附言  ·  13 天前

    这里的用户频次限制是针对用户id+任务id

    然后就是我们只有tomcat,不是微服务..

    第 2 条附言  ·  13 天前

    这是图片

    15 条回复
    infoscope
        1
    infoscope  
       13 天前 via iPhone
    这样坐为了解决什么问题
    memorycancel
        2
    memorycancel  
       13 天前
    我理解 tomcat 应该是总入口,如果是为了限制业务,那么应该把 redis 读取模块放到应用层 application ,在应用层写一个模块,而不是 tomcat 。
    magicZ
        3
    magicZ  
       13 天前
    看半天没看懂需求 ,要不还是画个图吧
    StinkyTofus
        4
    StinkyTofus  
       13 天前
    你这个需求和方案就相当于实现一个中间件把 redis 封装了一层, 对 redis 的请求进行过滤和拦截。 但是这个专门读取 redis 的服务不就成了一个新的“Redis”了吗? 依然存在资源访问瓶颈, 那还不如直接去读 Redis 。
    oneisall8955
        5
    oneisall8955  
       13 天前
    友情提示,剧情回顾:
    集群如何控制 QPS? https://www.v2ex.com/t/1087045
    redis 控制用户频次问题 https://www.v2ex.com/t/1088766
    redis 逆天问题 每多少分钟限制多少次 https://www.v2ex.com/t/1089526
    xuanbg
        6
    xuanbg  
       13 天前
    直接网关限流不行吗?限流策略有:
    1 、限制访问间隔时间,譬如每次访问必须间隔 3 秒。这个可以有效防刷。
    2 、设定时间窗口内限制访问次数,如每小时 300 次,从第一次访问开始计时,300 次满就必须要等计时满 1 小时后次数清零。
    3 、以上两个结合,这样虽然是每 3 秒可以访问一次,但每小时上限只有 300 次而非 1200 次。
    chenfang
        7
    chenfang  
    OP
       13 天前
    @infoscope 解决请求 redis 次数过多的
    chenfang
        8
    chenfang  
    OP
       13 天前
    @oneisall8955
    集群控制 QPS 那个跟现在 redis 控制用户频次不是一个问题

    集群控制 QPS 的解决方案基于请求量大概率是比较平稳的所以只用了一个百分比来过滤请求,动态调整百分比大小基本就可以实现,这种性能影响最小,结论就是能用
    realpg
        9
    realpg  
       13 天前
    你需要做的是把你的需求说明白 而不是把你最开始帖子的内容隔一阵子就重新发一遍

    你的四个帖子我都看过 表达能力堪忧
    chenfang
        10
    chenfang  
    OP
       13 天前
    @realpg 好吧 我再整理一下
    caryqy
        11
    caryqy  
       13 天前
    @chenfang 理论上单节点 10w+, 可能有点多想了,直接用别怕,请求量对于 redis 可能还没开始发力
    codespots
        12
    codespots  
       13 天前
    我觉得你遇到了 X-Y 问题,而不是具体的方案设计问题
    chenfang
        13
    chenfang  
    OP
       13 天前
    @caryqy 我们一天的请求是 250 亿左右,换算 qps 为:31 万,不是所有都会请求 redis,按一半的话 15W*(3 或者 4)=45W,虽然现在是集群,但是这个数量也不少了
    caryqy
        14
    caryqy  
       13 天前
    @chenfang 250 亿, 牛逼, 撤回我说的
    monmon
        15
    monmon  
       13 天前
    我猜你在找的是 Redisson RRateLimiter
    这里有个封装好的,稍微改造一下应该就可以满足你的需求
    https://github.com/dromara/RuoYi-Vue-Plus/tree/5.X/ruoyi-common/ruoyi-common-ratelimiter
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1627 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:50 · PVG 00:50 · LAX 08:50 · JFK 11:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.