イベント駆動のスケーリングは、外部信号が実際の作業を示すまでワーカーコンテナを停止または非常に低いレプリカ数に保つことで、アイドル状態のホームサーバーの作業を減らします。空のキューをポーリングしたり、まれなタスクを待つ継続的に稼働するプロセッサの代わりに、需要に応じて容量を起動します。
削減は無料ではありません。軽量のコントローラーやイベントアダプターはトリガーを監視し続ける必要があり、スケール・トゥ・ゼロ後の最初のイベントはスケジューリング、イメージ起動、初期化、接続設定を待ちます。イベント駆動のスケーリングは、一定のアイドル消費を可変の起動遅延に置き換えます。
イベント信号はCPU使用率とどう違うのですか?
CPUベースのスケーリングは実行中のプロセスが忙しくなってから反応しますが、イベント信号は保留中の作業を示します。キュー、Webhook、スケジュール、ストリーム遅延、またはカスタムメトリックは、ワーカーがCPUを消費する前に需要を示すことができます。
これはバックグラウンドプロセッサにとって重要です。なぜなら、アイドル状態のワーカーはほとんどCPUを使わなくても、数千のメッセージがコンテナ外で待機していることがあるからです。リソースメトリックは現在のレプリカを示し、イベントメトリックはまだ処理されていない作業を示します。
したがって、有用なトリガーはアプリケーションのボトルネックに近いものです。キューの長さ、最古メッセージの経過時間、または未処理ジョブは、ホスト全体のCPUやメモリ使用量よりもワーカーの需要をより直接的に反映します。
スケール・トゥ・ゼロはどのようにしてアイドルワーカーを削除するのですか?
トリガーが保留中の作業がないと報告すると、アイドル状態のワーカーはゼロにスケールできます。ワーカーコンテナは通常のCPUサイクル、アプリケーションメモリ、開いている接続、または定期的な内部タイマーを消費しなくなります。
節約できるリソースはワークロードによって異なります。小さなGoワーカーはほとんどメモリを使わないかもしれませんが、画像処理、オートメーションランタイム、言語モデルヘルパー、またはJVMサービスは、待機中でも数百メガバイトを保持することがあります。
スケール・トゥ・ゼロは、非同期ワーカーやまれなバッチタスクに最も有効です。インタラクティブなDNS、認証、ダッシュボード、またはホームオートメーションのエンドポイントは、少なくとも1つのウォームレプリカが必要な場合があります。なぜなら、ユーザーが最初の応答を直接待っているからです。
キューの深さはどのようにレプリカ数を決定するのですか?
キュー駆動型ワーカーの場合、キューの深さがワーカーのレプリカ数を決定します。レプリカあたりのメッセージ数のようなターゲットは、バックログを望ましい並列処理量に変換します。
タスクの実行時間が変動する場合、キューの長さだけでは不十分なことがあります。最古メッセージの経過時間、到着率、平均処理時間、最大安全同時実行数が、短期間の高負荷タスクがストレージ、データベース、外部APIを圧倒するのを防ぎます。
スケーラーはキャパシティを変更しますが、アプリケーションは安全な同時実行性を維持する必要があります。複数のレプリカはジョブを原子操作で取得し、失敗を重複せずにリトライし、イベントストリームが要求する場合は順序を尊重しなければなりません。
アプリケーションがゼロの状態でもどのような作業が残るのか?
ワークロードは消えることがありますが、スケーラーはオペレーター、メトリクスアダプター、キューウォッチャー、HTTPインターセプターを通じて外部イベントソースをポーリングします。これらは常に利用可能な状態を保ちます。
そのコントロールプレーンはすべてのアプリケーションワーカーよりはるかに少ないリソースを使用しますが、オーバーヘッドがゼロではありません。ポーリング間隔はネットワークリクエストやウェイクアップを発生させ、メトリクスはストレージを必要とし、オーケストレーターは新しいコンテナをスケジュールするために十分な基盤サービスを稼働させ続けなければなりません。
ヘルスチェックはアイドル状態のホームサーバーでも定期的な作業を発生させます。そのため、イベント駆動のスケーリングはアイドル作業の一部を減らしますが、すべてのプローブ、コントローラー、ログコレクター、プラットフォームデーモンを排除するわけではありません。
なぜ最初のイベントはコールドスタートのコストを払うのか?
レプリカ数がゼロに達した後、スケール・トゥ・ゼロはコールドスタートを引き起こします。オーケストレーターは需要を検出し、レプリカをスケジュールし、マウントとネットワークを準備し、イメージを起動し、アプリケーションの準備完了を待ちます。
イメージキャッシュ、アプリケーションの初期化、データベース接続、ランタイムコンパイル、大規模モデルは、最初のイベントを後のイベントよりもはるかに遅くする可能性があります。ユーザー向けサービスは、オートスケーラーが正しく動作していても壊れているように感じることがあります。
1つのウォームレプリカを維持することで遅延を回避できますが、いくつかのアイドルリソース使用が発生します。イメージの事前プル、起動依存関係の削減、軽量ワーカーの使用、または早期キュー信号でのスケーリングにより、フルワーカープールをアクティブに保たずにコールドスタートのペナルティを狭めることができます。
クールダウンとワークロードタイプはどのように境界を設定するのか?
スケーラーはキューが一時的に空になった直後にワーカーを即停止すべきではありません。クールダウン期間はイベントが短時間に集中して発生する際の急激な振動を防ぎます。
長いクールダウンは近接タスクのためにウォームキャパシティを維持しますが、より多くのアイドルリソースを消費します。短いクールダウンはメモリとCPUをより節約しますが、コールドスタート頻度、イメージの変動、接続設定が増加します。
待機、キューイング、再試行、クリーンな起動が可能なワークロードにはイベント駆動型スケーリングを選択してください。低遅延のインタラクティブパス、ステートフルシングルトンサービス、または初期化コストが節約されるアイドル作業を上回るアプリケーションにはベースラインレプリカを維持しましょう。
| ワークロードパターン | スケーリングの選択 | 主なトレードオフ |
|---|---|---|
| 時折のキューワーカー | ゼロにスケール | 最大のアイドル節約、初回ジョブ遅延 |
| バースト型バックグラウンドプロセッサ | クールダウン付きイベント駆動レプリカ | バックログと起動の変動をバランス |
| インタラクティブなウェブサービス | ウォームレプリカを1つ維持 | アイドルメモリを使い応答時間を維持 |
| ステートフルシングルトン | 通常は稼働し続ける | 起動と所有権の移行は節約を上回ることがある |
よくある質問
イベント駆動型スケーリングにはKubernetesが必要か?
いいえ。KEDAのようなKubernetesツールが一般的な例ですが、同じ仕組みはsystemdソケットアクティベーション、サーバーレスランタイム、キュートリガージョブ、またはカスタムホームサーバーコントローラーで実装可能です。
スケール・トゥ・ゼロはホームサーバー全体を停止するのか?
できません。選択されたアプリケーションレプリカのみを停止します。ホスト、オーケストレーター、イベントウォッチャー、ネットワーキング、ストレージ、その他の常時稼働サービスは継続して動作します。
HTTPコンテナは安全にゼロにスケールできるか?
コンテナ起動中に常時稼働のゲートウェイやインターセプターが最初のリクエストを保持または再試行できる場合は可能です。ただし、発生するコールドスタートの遅延はユーザー体験に合致している必要があります。
なぜすべてのセルフホストアプリをゼロにスケールしないのか?
一部のアプリは即時応答が必要で、ステートフルな所有権を維持し、予期しない接続を受け入れたり、継続的な監視を行ったりします。これらのアクティベーションコストとサービス役割は、節約されるアイドルリソースを上回ることがあります。
最終的なまとめ
イベント駆動型スケーリングは、すべてのワーカーを常に稼働させるのではなく、レプリカ数を実際の需要に連動させることで、アイドル状態のホームサーバーの作業を削減します。キュー信号とスケール・トゥ・ゼロによりアイドル状態のアプリケーションプロセスを削除しつつ、コントローラー、オーケストレーター、監視経路は稼働し続けます。この設計は、ワークロードが安全にキューイングでき、節約されたリソースがコールドスタートとクールダウンのトレードオフを正当化する場合に最も効果的です。
テック&AIハブ
もっと読む

ホームサーバーにサービスを追加すると、Home Assistantのアーキテクチャはなぜ変化するのか?
サービスを追加して共有状態、キュー、デバイス、更新サイクル、または障害ドメインが増えると、単にコンテナが増えるだけでなく、Home Assistantのアーキテクチャが変わります。

キャッシュを容量と取り違えずにHome Assistantのパフォーマンスを測定する方法
ウォーム状態での結果は、容量ではなく再利用を示します。コールドスタート、ウォーム時の定常状態、繰り返し負荷、テールレイテンシ、そして最初に飽和するリソースを測定してください。

Home Assistantで家全体を制御するには、どれくらいの自動化同時実行数が必要ですか?
家全体の自動化の多くは、重複実行数に上限を設けるだけで十分です。実行時間×トリガー発生率で同時実行数を見積もり、その後、下流システムが安全に処理できる容量を上限にします。
