速率限制¶
Swift 中的速率限制被实现为可插拔的中间件。速率限制应用于导致对账户和容器 sqlite 数据库进行写入的请求。它使用 memcached,并且依赖于代理服务器具有高度同步的时间。速率限制的精度受限于代理服务器时钟的准确性。
配置¶
所有配置都是可选的。如果未提供账户或容器限制,则不会进行速率限制。可用的配置
选项 |
默认值 |
描述 |
clock_accuracy |
1000 |
表示代理服务器的系统时钟彼此之间的准确程度。1000 表示所有代理的时钟彼此准确到 1 毫秒。任何速率限制都不应高于时钟精度。 |
max_sleep_time_seconds |
60 |
如果必要的休眠时间超过给定的 max_sleep_time_seconds,应用程序将立即返回 498 响应。 |
log_sleep_time_seconds |
0 |
为了能够观察速率限制,将此值设置为 > 0,所有大于该数字的休眠时间都将被记录。 |
rate_buffer_seconds |
5 |
速率计数器可以下降并允许赶超(以高于列出的速率)的秒数。较大的数字将导致速率出现更大的峰值,但平均精度更高。 |
account_ratelimit |
0 |
如果设置,将限制对 /account_name/container_name 的 PUT 和 DELETE 请求。数字表示每秒请求数。 |
container_ratelimit_size |
‘’ |
当与 container_ratelimit_x = r 一起设置时:对于大小为 x 的容器,将请求限制为每秒 r 个请求。将限制对 /a/c/o 的 PUT、DELETE 和 POST 请求。 |
container_listing_ratelimit_size |
‘’ |
当与 container_listing_ratelimit_x = r 一起设置时:对于大小为 x 的容器,将列表请求限制为每秒 r 个请求。将限制对 /a/c 的 GET 请求。 |
容器速率限制是根据给定的值线性插值的。一个示例容器速率限制可以是
container_ratelimit_100 = 100
container_ratelimit_200 = 50
container_ratelimit_500 = 20
这将导致
容器大小 |
速率限制 |
0-99 |
无限制 |
100 |
100 |
150 |
75 |
500 |
20 |
1000 |
20 |
账户特定速率限制¶
上述速率限制是为了防止“向单个容器的大量写入”瓶颈导致问题。也可能存在单个账户只是使用了集群过多资源的问题。在这种情况下,容器速率限制可能无法帮助,因为客户可能正在向分布式容器发送数千个 req/sec,每个容器只获得总数的一小部分,因此这些限制永远不会触发。如果系统管理员注意到这一点,他/她可以在账户上设置 X-Account-Sysmeta-Global-Write-Ratelimit,这将限制该账户可以对整个账户执行的总写入请求数(PUT、POST、DELETE、COPY)。此限制将添加到上述适用的账户/容器限制之外。由于 gatekeeper 中间件,此标头将对用户隐藏,并且只能使用直接客户端发送到账户节点来设置。它接受一个浮点值,并且仅当该值 > 0 时才会限制请求。
黑/白名单¶
要将账户列入黑名单或白名单,请设置
X-Account-Sysmeta-Global-Write-Ratelimit: BLACKLIST
或者
X-Account-Sysmeta-Global-Write-Ratelimit: WHITELIST
在账户标头中。