rate-limiting - 基于同一路由的多个键的速率限制
问题描述
我们使用 spring-cloud-gateway 来限制使用 RedisRateLimiter 的速率。如果我们有一个键来限制每条路线的速率,那么一切都是开箱即用的。但是,我们有一个用例,其中针对单个给定路线。我们想通过多层进行速率限制。例如,对于给定的路由 id 1,我们希望将池中的某个用户的速率限制为每秒 10 个请求。但是,与此同时,我们还希望将同一路由的整体池请求速率限制为每秒 100 个。所以基本上对同一条路线使用 2 个不同的键,同时同时跟踪每个键。
我们尝试使用速率限制器过滤器,但我们无法在配置中声明多个速率限制器。我们还尝试使用以下内容:
spring.cloud.gateway:
routes:
- id: 1
uri: https://example.org/
predicates:
- Path=/path
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
key-resolver: "#{@userKeyResolver}"
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 100
redis-rate-limiter.burstCapacity: 200
key-resolver: "#{@poolKeyResolver}"
在上面的描述中,池中可以有多个用户。因此,用户的速率应限制为每秒 10 个请求的补充速率,而整体池的速率应限制为每秒 100 个的补充速率。但是由于使用了相同的过滤器,因此速率限制器的第一个配置被第二个覆盖。
我们查看了以下帖子,建议了一种基于独立于路由的用户计划的速率限制方法:基于 Spring Cloud Gateway 中的用户计划的速率限制
但是,这不适用于我们的用例,因为它的速率限制基于给定的 API 密钥,与路由无关。有没有办法我们可以使用 Spring 云网关来实现这一点。任何可以让我们支持这个用例的配置。
解决方案
推荐阅读
- python - Python TK 如何检查输入是字符串还是数字?
- python-3.x - 没有这样的模块,即使我已经在 mac 上安装了它
- javascript - Fluent UI React 状态总是重置为默认值
- z3 - z3 中对实数的普遍量化约束
- c# - Newtonsoft.Json.JsonSerializationException:'反序列化对象时出现意外标记:使用动态对象注释
- node.js - 为实时服务器存储图像和视频的最有效方法是什么?
- c - (C) 将数据分配到堆内存中
- python - google capcha selenium python下载图片
- listview - 如何将行动态添加到 K2 列表视图
- typescript - 使用 TypeORM 以自引用关系获取数据