ワーカーをパッケージ化する
サポートされているランタイム、固定された依存関係、サービス管理ツールまたはコンテナを使用してください。再起動回数の上限と専用のサービスユーザーを設定します。プロバイダーのプライベート認証情報は、アプリケーションの公開ファイルの外にある保護された設定に保管してください。
重要な操作の前に進行状況を保存する
ジョブには耐久性のあるキューまたはデータベースを使用してください。一意の操作識別子を割り当て、外部リクエストを記録し、不確実な結果を照合してください。再起動によって2通目のメール送信、2件目の注文作成、二重請求が発生してはなりません。
有用な可観測性を追加する
プロセスの存在だけを確認するのではなく、ジョブの完了状況、キューの滞留時間、エラー率、コストを監視してください。ログはレビューできる程度に小さく保ち、保持する必要のないトークン、プロンプト、ドキュメントはマスキングしてください。
明確な上限を設定する
モデルの支出、ブラウザの同時実行数、実行時間、再試行回数を制限してください。簡単に一時停止できるスイッチと、重要なアクションに対する人によるレビュー経路を用意します。適切に監視された小規模なワーカーの方が、制限のないワーカーよりも信頼しやすくなります。
スーパーバイザーと意図的なスケジュールを使用してください
Systemd と Docker は、ターミナル切断後もプロセスを維持する一般的な方法です。systemd サービスでは、Type=exec により単純なバックグラウンド起動よりも実行失敗を直接報告でき、Restart=on-failure により制限付きポリシーで失敗時に再起動できます。スケジュールされたジョブは実行の重複を避ける必要があります。作業ディレクトリ、サービスユーザー、環境変数を明示してください。 この例では、koala-agent ユーザー、仮想環境、ワーカーモジュール、プライベート環境ファイルがすでに存在することを前提としています。ユニットをインストールする前にこれらを調整してください。
- 専用のサービスアカウントを使用する
- 再起動の遅延と失敗の上限を設定する
- スケジュール実行を開始する前に、前回のジョブ状態を確認してください
[Unit]
Description=Example agent worker
After=network-online.target
[Service]
Type=exec
User=koala-agent
WorkingDirectory=/opt/koala-agent
EnvironmentFile=/etc/koala-agent.env
ExecStart=/opt/koala-agent/.venv/bin/python -m worker
Restart=on-failure
RestartSec=10
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target公式ドキュメント: Systemdサービスのセマンティクス
1日あたりの予算と重複の境界を設定する
ワーカーに最大リクエスト数、支出上限、実行タイムアウトを設定してください。外部世界に影響するアクションには永続的な冪等性レコードを使用してください。ブラウザのクリックが成功しても、プロセスが応答を受け取る前に発生する可能性があります。再試行する前に外部状態を確認してください。Docker Composeのシークレットマウントはシークレットをイメージ外に保てますが、パーミッションと消費側アプリケーションのレビューは依然として必要です。
公式ドキュメント: Docker Composeのシークレット
定期ジョブには明示的なキャッチアップポリシーを設定してください
永続的なキュー処理には長時間稼働するサービスを、範囲の定まったスケジュールタスクにはタイマー起動のoneshotサービスを使用してください。systemdのカレンダータイマーでは、Persistent=trueによりダウンタイム後に1回の見逃した起動をトリガーできますが、ビジネス上のバックログ全体を再現するわけではありません。そのキャッチアップが望ましいかを判断してください。RandomizedDelaySecは起動を分散でき、アプリケーションレベルのリースは2つのレプリカが同じスケジュール作業を処理するのを防ぎます。
- スケジュールを有効にする前に、意図するタイムゾーンを記録し、次回の実行時刻を確認してください。
- タスクの実行期限を、重複してはならない間隔より短くするか、有効期限と所有権を持つ永続リースを使用してください。
- ジョブは、以前のタイマーイベントがすべて実行されたと仮定するのではなく、保存された状態から未処理の作業を選択するようにしてください。
- 最新のマニュアルのディレクティブを使用する前に、インストールされている systemd のバージョンを確認してください。
# Read-only checks after creating your own matching units.
systemctl list-timers --all
systemctl status koala-agent.service
journalctl -u koala-agent.service --since today --no-pager公式ドキュメント: systemd: タイマースケジューリング
クラッシュループと停止したワーカーを区別する
再起動ポリシーは失敗したプロセスを復旧できますが、無効な認証情報や壊れたマイグレーションを数秒ごとに繰り返すと、障害がより騒がしくなります。サービスの起動回数を制限し、繰り返し失敗時にアラートを発してください。稼働中のプロセスもスタックする可能性があります。最も古いジョブの経過時間と最後に完了した操作を測定してください。使い捨てのジョブで API の停止、ディスクの空き、プロセスの停止をテストし、永続状態が外部アクションの重複を防ぐことを確認してください。
- アプリケーションでプロバイダーの予算とリクエストタイムアウトを設定し、さらにランタイム上で CPU/メモリの境界を設定してください。
- Docker コンテナはコンテナであるという理由だけでワークロード固有の有用なメモリ制限を持つわけではありません。制限は意図的に設定し、テストしてください。
- シークレットはイメージと公開ツリーの外に保存し、クラッシュログや診断情報でそれが秘匿されることをテストしてください。
- 手動の停止手段を確保し、支出、本番環境への書き込み、または外部メッセージについて適切なレビューを必須としてください。
公式ドキュメント: systemd: サービスの監視 · Docker: コンテナのリソース制約