请求速率限制器

Solr 允许按请求类型进行速率限制。每种请求类型都可以分配一个允许的最大并发活动请求数。默认速率限制针对更新和搜索实现。

如果请求超出请求配额,则会使用 HTTP 错误代码 429(请求过多)拒绝进一步的传入请求。

请注意,速率限制在实例 (JVM) 级别工作,而不是在核心或集合级别工作。在规划容量时请考虑这一点。未来计划在此处进行更细粒度的执行 (SOLR-14710)。

请求的速率限制桶由该请求的唯一 Solr-Request-Type HTTP 标头的值确定。没有 Solr-Request-Type 标头的请求将被接受并处理,而没有速率限制。 “槽位借用”和“保证槽位”是相对于指定的速率限制桶定义的。

目前,速率限制只识别一个 Solr-Request-Type 值:字面字符串值 QUERY。因此,只有指定标头 Solr-Request-Type: QUERY 的请求才会被速率限制(并且在尊重多种请求类型之前,其他 Solr-Request-Type 规范根本不会被速率限制,“槽位借用”和“保证槽位”的概念仅在多种请求类型中才有意义,实际上没有任何效果)。

何时使用速率限制器

当用户希望为特定请求类型分配请求线程池的保证容量时,应使用速率限制器。索引和搜索请求主要相互竞争 CPU 资源。这在生产工作负载中的高压力下尤其明显。当前的实现有一个查询速率限制器,可以释放用于索引的资源。

速率限制器配置

默认的速率限制器是搜索速率限制器。因此,可以使用以下命令进行配置

curl -X POST -H 'Content-type:application/json' -d '{
  "set-ratelimiter": {
    "enabled": true,
    "guaranteedSlots":5,
    "allowedRequests":20,
    "slotBorrowingEnabled":true,
    "slotAcquisitionTimeoutInMS":70
  }
}' https://127.0.0.1:8983/api/cluster

启用查询速率限制器

控制是否启用查询速率限制器。默认值为 false

"enabled": true

最大并发请求数

允许设置在给定时间点的最大并发搜索请求数。默认值为核心数 * 3。

"allowedRequests":20

请求槽分配等待时间

当所有槽都已满时,请求在被放入等待队列之前,等待槽可用的时间(以毫秒为单位)。这允许请求在速率限制器的请求槽不可用是瞬时现象时有机会继续进行。默认值为 -1,表示不等待。0 也表示相同含义 - 不等待。请注意,较高的请求分配时间可能会导致更长的队列时间和更长的查询等待时间。

"slotAcquisitionTimeoutInMS":70

启用槽借用

是否启用槽借用(如下所述)。默认值为 false。

此功能是实验性的,如果借用请求持续时间过长,可能会导致槽被阻塞。
"slotBorrowingEnabled":true,

保证槽

查询速率限制器将保留的保证槽的数量,而不管查询请求的负载如何。仅当启用槽借用时才使用此值,并作为查询速率限制器不允许其他请求类型从其配额中借用槽的阈值。默认值为允许的并发请求数 / 2。

此功能是实验性的,如果借用请求持续时间过长,可能会导致槽被阻塞。
"guaranteedSlots":5,

要点

以下是一些在使用速率限制器时需要注意的事项。

超额订阅

可以为请求类型定义一个配额大小,该配额大小超过可用线程池的大小。Solr 不强制执行对请求类型可以定义的配额大小的规则。这样做是为了允许用户完全控制其配额分配。但是,如果配额超过可用线程池的大小,线程池的标准排队策略将会生效。

槽借用

如果一个配额没有积压,而其他配额有积压,则相对不繁忙的配额可以从较繁忙的配额“借用”槽。目前这是以循环方式进行的,并且有一个未来的待办任务使其成为基于优先级的模型 (https://issues.apache.org/jira/browse/SOLR-14709)。

此功能是实验性的,不保证借用的槽会及时返回。