速率限制

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

在账户标头中。