请求速率限制器

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

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

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

何时使用速率限制器

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

速率限制器配置

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

curl -X POST -H 'Content-type:application/json' -d '{
  "set-ratelimiter": {
    "enabled": true,
    "guaranteedSlots":5,
    "allowedRequests":20,
    "slotBorrowingEnabled":true,
    "slotAcquisitionTimeoutInMS":70
  }
}' http://localhost: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).

此功能为实验性功能,不能保证借用的插槽能及时归还。