リクエストレートリミッター

Solrでは、リクエストタイプごとにレート制限を設定できます。各リクエストタイプには、アクティブにできる同時リクエストの最大許容数が割り当てられます。デフォルトのレート制限は、更新と検索に実装されています。

リクエストがリクエストクォータを超過した場合、それ以降の着信リクエストはHTTPエラーコード429(Too Many Requests)で拒否されます。

レート制限は、コアまたはコレクションレベルではなく、インスタンス(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
  }
}' 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)。

この機能は実験的なものであり、借用したスロットが時間内に返される保証はありません。