このプロジェクトは 100% 実験的なものです。コントローラを実稼働環境や共有環境にインストールしようとしないでください。
Temporal Worker Controller の目標は、ワーカーのバージョニングを活用しながら、Kubernetes 上でワーカーを簡単に実行できるようにすることです。
Temporal の決定論的な制約は、ワークフロー コードの変更をロールアウトまたはロールバックするときに問題を引き起こす可能性があります。
ワークフロー決定論に対する従来のアプローチは、バージョン管理チェックの背後で新しい動作を制御することです。これらのチェックをコードベースから安全に削除するには、多くの場合、実行中のすべてのワークフローのクエリが含まれる慎重なプロセスであるため、時間の経過とともに、これらのチェックが技術的負債の原因になる可能性があります。
ワーカーのバージョニングは、特定のコード リビジョンを実行しているワーカーにワークフローの実行を固定できるようにする代替アプローチです。これにより、ワークフロー作成者はコード内のバージョン チェックを省略し、代わりに Temporal を利用してワークフローの実行を互換性のあるコードを実行するワーカーに固定し、複数のバージョンのワーカーを並行して実行できるようになります。
このプロジェクトは、どのワーカー バージョンにアクティブなワークフローが残っているかの追跡、バージョン管理されたワーカー デプロイメントのライフサイクルの管理、デプロイメント後にデフォルト バージョンを更新するための Temporal API の呼び出しに関する記録を簡素化する自動化を提供することを目的としています。
新しいワーカー バージョンの登録
バージョン管理されたワーカー デプロイメント リソースの作成
到達不能なワーカーデプロイメントの削除
新しいワーカー バージョンの手動、ブルー/グリーン、プログレッシブ ロールアウト
ワーカーデプロイメントの自動スケーリング
互換性のあるワーカー バージョンへの自動ロールオーバー
新しいワーカー バージョンのカナリア分析
古いバージョンのワークフローのタイムアウト後のオプションのキャンセル
古いバージョンのワークフローにContinueAsNew
シグナルを渡す
このコントローラーと互換性を持たせるには、次の標準環境変数を使用してワーカーを構成する必要があります。
WORKER_BUILD_ID
TEMPORAL_HOST_PORT
TEMPORAL_TASK_QUEUE
TEMPORAL_NAMESPACE
これらはそれぞれ、ポッド テンプレートの環境で自動的に設定されるため、 TemporalWorker
仕様の外で手動で指定する必要はありません。
すべてのTemporalWorker
リソースは、1 つ以上の標準的なDeployment
リソースを管理します。各デプロイメントはポッドを管理し、ポッドはそれぞれのバージョンに固定されたタスクについて Temporal をポーリングします。
フローチャート TD
wd[テンポラルワーカー]
サブグラフ「最新/デフォルトのワーカーのバージョン」
d5["デプロイメント v5"]
rs5["レプリカセット v5"]
p5a["ポッド v5-a"]
p5b["ポッド v5-b"]
p5c["ポッド v5-c"]
d5 --> rs5
rs5 --> p5a
rs5 --> p5b
rs5 --> p5c
終わり
サブグラフ「非推奨のワーカー バージョン」
d1["デプロイメント v1"]
rs1["レプリカセット v1"]
p1a["ポッド v1-a"]
p1b["ポッド v1-b"]
d1 --> rs1
rs1 --> p1a
rs1 --> p1b
dN["展開 ..."]
終わり
wd --> d1
wd --> dN
wd --> d5
p1a-。 「ポーリングバージョン v1」 .-> サーバー
p1b-。 「ポーリングバージョン v1」 .-> サーバー
p5a-。 「ポーリング バージョン v5」 .-> サーバー
p5b-。 「ポーリング バージョン v5」 .-> サーバー
p5c-。 「ポーリング バージョン v5」 .-> サーバー
サーバー[「テンポラルサーバー」]
読み込み中新しいワーカー バージョンがデプロイされると、ワーカー コントローラーは Temporal での新しいデフォルト ワーカー バージョンの登録を自動化します。
古いワークフローの実行が終了し、非推奨のワーカー バージョンが必要なくなると、ワーカー コントローラーも古いデプロイメントを削除してリソースを解放します。
シーケンス図
自動番号付け
開発者としての参加者
Kubernetes としての参加者 K8
WorkerController としての参加者の Ctl
時間的参加者 T
Dev->>K8s: TemporalWorker "foo" を作成する (v1)
K8s-->>Ctl: TemporalWorker "foo" が作成されたことを通知
Ctl->>K8s: デプロイメント「foo-v1」を作成
Ctl->>T: v1 を新しいデフォルトとして登録します
Dev->>K8s: TemporalWorker "foo" を更新 (v2)
K8s-->>Ctl: TemporalWorker "foo" が更新されたことを通知
Ctl->>K8s: デプロイメント「foo-v2」を作成
Ctl->>T: v2 を新しいデフォルトとして登録します
Ctl->>Ctl: v1 と v2 の間で重大な変更の検出を実行します。
Ctl->>T: バージョンに互換性がある場合は、v1 と v2 をマージします。
ループポーリングテンポラル API
Ctl-->>T: v1 ワークフローの実行が終了するまで待ちます
終わり
Ctl->>K8s: デプロイメント「foo-v1」を削除
読み込み中このプロジェクトは非常に初期段階にあります。そのため、外部コードの貢献はまだ募集されていません。
バグレポートや機能リクエストは大歓迎です!問題を提出してください。
質問や提案がある場合、またはその他の貢献に興味がある場合は、Temporal Slack で@jlegrone
に連絡することもできます。