请求速率限制器
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
要点
以下是一些在使用速率限制器时需要注意的事项。
超额订阅
可以为请求类型定义一个配额大小,该配额大小超过可用线程池的大小。Solr 不强制执行对请求类型可以定义的配额大小的规则。这样做是为了允许用户完全控制其配额分配。但是,如果配额超过可用线程池的大小,线程池的标准排队策略将会生效。
槽借用
如果一个配额没有积压,而其他配额有积压,则相对不繁忙的配额可以从较繁忙的配额“借用”槽。目前这是以循环方式进行的,并且有一个未来的待办任务使其成为基于优先级的模型 (https://issues.apache.org/jira/browse/SOLR-14709)。
此功能是实验性的,不保证借用的槽会及时返回。 |