概要
Fess には、OpenSearch の CPU 使用率に基づいてリクエストを制御する負荷制御機能があります。 この機能により、検索エンジンの高負荷時にリクエストを自動的に制限し、システムの安定性を保護できます。
負荷制御の特徴:
OpenSearch クラスタの CPU 使用率をリアルタイムに監視
Web リクエストと API リクエストで独立した閾値を設定可能
閾値を超えた場合、HTTP 429 (Too Many Requests) を返却
管理画面・ログイン・静的リソースは制御対象外
デフォルトでは無効(閾値=100)
設定
fess_config.properties に以下のプロパティを設定します:
# Web リクエストの CPU 使用率閾値(%)
# CPU 使用率がこの値以上の場合にリクエストを拒否
# 100 に設定すると無効(デフォルト: 100)
web.load.control=100
# API リクエストの CPU 使用率閾値(%)
# CPU 使用率がこの値以上の場合にリクエストを拒否
# 100 に設定すると無効(デフォルト: 100)
api.load.control=100
# CPU 使用率の監視間隔(秒)
# OpenSearch クラスタの CPU 使用率を取得する間隔
# デフォルト: 1
load.control.monitor.interval=1
注釈
web.load.control と api.load.control の両方が 100(デフォルト)の場合、 負荷制御機能は完全に無効となり、監視も開始されません。
動作の仕組み
監視の仕組み
負荷制御が有効な場合(いずれかの閾値が100未満)、LoadControlMonitorTarget が定期的に OpenSearch クラスタの CPU 使用率を監視します。
OpenSearch クラスタの全ノードの OS 統計情報を取得
全ノードの中で最も高い CPU 使用率を記録
load.control.monitor.intervalで指定した間隔(デフォルト1秒)ごとに監視監視は遅延初期化により、最初のリクエスト時に開始
注釈
監視情報の取得に失敗した場合、CPU 使用率は 0 にリセットされます。 連続して3回失敗するとログレベルが WARNING から DEBUG に変更されます。
リクエスト制御
リクエストが到着すると、LoadControlFilter が以下の順序で処理します:
対象外のパスかどうかを確認(対象外ならそのまま通過)
リクエストの種類(Web / API)を判定
対応する閾値を取得
閾値が 100 以上の場合は制御しない(そのまま通過)
現在の CPU 使用率と閾値を比較
CPU 使用率 >= 閾値の場合、HTTP 429 を返却
制御対象外のリクエスト:
/adminで始まるパス(管理画面)/errorで始まるパス(エラーページ)/loginで始まるパス(ログインページ)静的リソース(
.css,.js,.png,.jpg,.gif,.ico,.svg,.woff,.woff2,.ttf,.eot)
Web リクエストの場合:
HTTP 429 ステータスコードを返却
エラーページ(
busy.jsp)を表示
API リクエストの場合:
HTTP 429 ステータスコードを返却
JSON レスポンスを返却:
{
"response": {
"status": 9,
"message": "Server is busy. Please retry after 60 seconds.",
"retry_after": 60
}
}
設定例
Web リクエストのみ制限する
Web の検索リクエストのみ制限し、API は制限しない設定:
# Web: CPU 使用率 80% 以上でリクエストを拒否
web.load.control=80
# API: 制限なし
api.load.control=100
# 監視間隔: 1秒
load.control.monitor.interval=1
Web と API の両方を制限する
Web と API で異なる閾値を設定する例:
# Web: CPU 使用率 70% 以上でリクエストを拒否
web.load.control=70
# API: CPU 使用率 80% 以上でリクエストを拒否
api.load.control=80
# 監視間隔: 2秒
load.control.monitor.interval=2
注釈
API の閾値を Web より高く設定することで、高負荷時にまず Web のリクエストを制限し、 さらに負荷が高まった場合に API リクエストも制限するという段階的な制御が可能です。
レート制限との違い
Fess には負荷制御とは別に レート制限の設定 機能があります。 これらは異なるアプローチでシステムを保護します。
| 項目 | レート制限 | 負荷制御 |
|---|---|---|
| 制御の基準 | リクエスト数(単位時間あたり) | OpenSearch の CPU 使用率 |
| 目的 | 過度なリクエストの防止 | 検索エンジンの高負荷保護 |
| 制限単位 | IP アドレスごと | システム全体 |
| レスポンス | HTTP 429 | HTTP 429 |
| 適用対象 | 検索API / AIモードAPI | Web リクエスト / API リクエスト |
両方の機能を組み合わせることで、より堅牢なシステム保護が可能です。
トラブルシューティング
負荷制御が有効にならない
原因: 設定が正しく反映されていない
確認事項:
web.load.controlまたはapi.load.controlが 100 未満に設定されているか設定ファイルが正しく読み込まれているか
Fess を再起動したか
正常なリクエストが拒否される
原因: 閾値が低すぎる
解決方法:
web.load.controlやapi.load.controlの値を引き上げるload.control.monitor.intervalを調整して監視頻度を変更するOpenSearch クラスタのリソースを増強する
警告
閾値を低く設定しすぎると、通常の負荷でもリクエストが拒否される可能性があります。 OpenSearch クラスタの通常時の CPU 使用率を確認した上で、適切な閾値を設定してください。
参考情報
レート制限の設定 - レート制限の設定