没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
基于 Redis 和 Lua 的分布式限流
Java 单机限流可以使用 AtomicInteger、RateLimiter 或 Semaphore 来实
现,但是上述方案都不支持集群限流。
集群限流的应用场景有两个:一个是网关,常用的方案有 Nginx 限流和
Spring Cloud Gateway。另一个场景是与外部或者下游服务接口的交互,因为
接口限制必须进行限流。
本文的主要内容为:
� Redis 和 Lua 的使用场景和注意事项,特别是 Key 映射的问题;
� Spring Cloud Gateway 中限流的实现。
集群限流的难点
本文将探讨一下,如果将 RateLimiter 扩展,让它支持集群限流,会遇到哪些
问题。
RateLimiter 会维护两个关键的参数 nextFreeTicketMicros 和 storedPermits,
它们分别是下一次填充时间和当前存储的令牌数。当 RateLimiter 的 acquire
函数被调用时,也就是有线程希望获取令牌时,RateLimiter 会对比当前时间
和 nextFreeTicketMicros,根据二者差距刷新 storedPermits,然后再判断更新
后的 storedPermits 是否足够,足够则直接返回,否则需要等待直到令牌足
够(Guava RateLimiter 的实现比较特殊,并不是当前获取令牌的线程等待,
而是下一个获取令牌的线程等待)。
由于要支持集群限流,所以 nextFreeTicketMicros 和 storedPermits 这两个
参数不能只存在 JVM 的内存中,必须有一个集中式存储的地方。而且,由
于算法要先获取两个参数的值,计算后在更新两个数值,这里涉及到竞态限
制,必须要处理并发问题。
资源评论
雨中伞下鱼
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功