コンテンツにスキップ

スーパービジョン

スーパーバイザはサービスライフサイクルを管理し、起動順序、自動再起動、グレースフルシャットダウンを処理します。auto_start: trueを持つサービスはアプリケーション起動時に開始されます。

サービスはlifecycleブロックを使用してスーパーバイザに登録します。プロセスの場合は、process.serviceを使用してプロセス定義をラップします:

# プロセス定義(コード)
- name: worker_process
kind: process.lua
source: file://worker.lua
method: main
# 監督されたサービス(ライフサイクル管理でプロセスをラップ)
- name: worker
kind: process.service
process: app:worker_process
host: app:processes
lifecycle:
auto_start: true
start_timeout: 30s
stop_timeout: 10s
stable_threshold: 5s
depends_on:
- app:database
restart:
initial_delay: 2s
max_delay: 60s
max_attempts: 10
フィールドデフォルト説明
auto_startfalseスーパーバイザ起動時に自動起動
start_timeout10s起動の最大許容時間
stop_timeout10sグレースフルシャットダウンの最大時間
stable_threshold5sサービスが安定とみなされるまでの実行時間
depends_on[]先に実行されている必要があるサービス

スーパーバイザは2つのソースから依存関係を解決します:

  1. depends_onで宣言された明示的な依存関係
  2. エントリ参照から抽出されたレジストリ抽出依存関係(設定内のdatabase: app:dbなど)
graph LR
A[HTTP Server] --> B[Router]
B --> C[Handler Function]
C --> D[Database]
C --> E[Cache]

依存関係は被依存者より先に起動します。サービスCがAとBに依存する場合、AとBの両方がRunning状態に達してからCが起動します。

データベースなどのインフラストラクチャエントリをdepends_onで宣言する必要はありません。スーパーバイザはエントリ設定内のレジストリ参照から依存関係を自動的に抽出します。

サービスが失敗すると、スーパーバイザは指数バックオフでリトライします:

lifecycle:
restart:
initial_delay: 1s # 最初のリトライ待機
max_delay: 90s # 最大遅延上限
backoff_factor: 2.0 # 試行ごとの遅延乗数
jitter: 0.1 # ±10%のランダム化
max_attempts: 0 # 0 = 無限リトライ
試行基本遅延ジッター付き(±10%)
11s0.9s - 1.1s
22s1.8s - 2.2s
34s3.6s - 4.4s
48s7.2s - 8.8s
N90s81s - 99s(上限)

サービスがstable_thresholdより長く実行されると、リトライカウンターがリセットされます。これにより、一時的な障害が遅延を永続的にエスカレートすることを防ぎます。

以下のエラーはリトライ試行を停止します:

  • コンテキストキャンセル
  • 明示的な終了リクエスト
  • リトライ不可としてマークされたエラー

サービスは特定のセキュリティIDで実行できます:

# プロセス定義
- name: admin_worker_process
kind: process.lua
source: file://admin_worker.lua
method: main
# セキュリティコンテキスト付き監督されたサービス
- name: admin_worker
kind: process.service
process: app:admin_worker_process
host: app:processes
lifecycle:
auto_start: true
security:
actor:
id: "service:admin-worker"
meta:
role: admin
groups:
- app:admin_policies
policies:
- app:data_access

セキュリティコンテキストは以下を設定します:

フィールド説明
actor.idこのサービスのID文字列
actor.metaキーバリューメタデータ(ロール、権限など)
groups適用するポリシーグループ
policies適用する個別ポリシー

サービス内で実行されるコードはこのセキュリティコンテキストを継承します。securityモジュールで権限をチェックできます:

local security = require("security")
if security.can("delete", "users") then
-- 許可
end
セキュリティコンテキストが設定されていない場合、サービスはアクターなしで実行されます。strictモード(デフォルト)では、セキュリティチェックが失敗します。認可が必要なサービスにはセキュリティコンテキストを設定してください。
stateDiagram-v2
[*] --> Inactive
Inactive --> Starting
Starting --> Running
Running --> Stopping
Stopping --> Stopped
Stopped --> [*]
Running --> Failed
Starting --> Failed
Failed --> Starting : retry

スーパーバイザはサービスをこれらの状態間で遷移させます:

状態説明
Inactive登録済みだが未起動
Starting起動中
Running正常に動作中
Stoppingグレースフルシャットダウン中
Stopped正常終了
Failedエラー発生、リトライの可能性あり

起動: 依存関係が先、次に被依存者。同じ依存レベルのサービスは並列で起動可能。

シャットダウン: 被依存者が先、次に依存関係。これにより、依存関係が停止する前に被依存サービスが終了することを保証します。

起動: database → cache → handler → http_server
シャットダウン: http_server → handler → cache → database