以前の記事でFessにIPベースのリクエスト制限機能を追加したことを紹介しましたが、今回はOpenSearchのCPU使用率に基づいてリクエストを制御する機能を追加しました。OpenSearchの負荷が高い場合にHTTP 429(Too Many Requests)を返すことで、過負荷状態でのサービス品質の低下を防ぎます。
概要
この機能は、OpenSearchクラスタのCPU使用率を定期的に監視し、設定した閾値を超えた場合にリクエストを拒否するサーブレットフィルター(LoadControlFilter)として実装されています。Web画面へのリクエストとAPIリクエストで独立した閾値を設定でき、デフォルトでは無効(閾値100%)になっています。
仕組み
監視の流れ
- バックグラウンドの監視タスク(
LoadControlMonitorTarget)がOpenSearchのノード統計APIを定期的に呼び出し、各ノードのCPU使用率を取得 - 全ノードの中で最大のCPU使用率を
SystemHelperに記録 - リクエストが来た際に、
LoadControlFilterが現在のCPU使用率と閾値を比較 - 閾値を超えている場合はリクエストを拒否
制御対象外のリクエスト
以下のリクエストは制御対象外となります。
- 管理画面(
/admin)へのアクセス - エラーページ(
/error)へのアクセス - ログインページ(
/login)へのアクセス - 静的リソース(CSS、JS、画像、フォントなど)
リクエスト拒否時の動作
- Web画面: ビジーエラーページにリダイレクトし、「サーバーが現在高負荷です」というメッセージを表示
- API: ステータスコード429のJSONレスポンスを返却(
Retry-After: 60ヘッダー付き)
APIのレスポンス例:
{
"response": {
"status": 9,
"message": "Server is busy. Please retry after 60 seconds.",
"retry_after": 60
}
}
設定方法
fess_config.propertiesに以下の設定を追加します。
# Web画面のCPU閾値(%)。CPU使用率がこの値以上のときに429を返す(100: 無効)
web.load.control=100
# APIのCPU閾値(%)。CPU使用率がこの値以上のときに429を返す(100: 無効)
api.load.control=100
# OpenSearch CPU監視の間隔(秒)
load.control.monitor.interval=1
たとえば、APIに対してCPU使用率80%以上でリクエスト制御を有効にする場合は以下のように設定します。
api.load.control=80
Web画面とAPIで異なる閾値を設定することもできます。
web.load.control=90
api.load.control=70
IPベースの制限との違い
以前追加したIPベースのリクエスト制限とは異なるアプローチの機能です。
| 項目 | IPベースの制限 | CPU負荷ベースの制御 |
|---|---|---|
| 制限の基準 | 特定IPからのリクエスト数 | OpenSearchのCPU使用率 |
| 目的 | 特定クライアントの過剰アクセス防止 | サーバー全体の過負荷防止 |
| 設定 | レート制限、ブラックリスト/ホワイトリスト | CPU閾値(Web/API独立) |
両方の機能を組み合わせることで、より効果的にサーバーを保護できます。
まとめ
CPU負荷ベースのリクエスト制御機能により、OpenSearchが高負荷状態のときにFessが自動的にリクエストを制限できるようになりました。デフォルトでは無効になっているため、必要に応じて閾値を設定してください。