# Google Workflow
[[Google]]が2003年に開発した、継続的なデータ処理を大規模に可能にするシステム。一発限りのバッチパイプラインがビジネス側の継続的な更新要求に圧倒されるという課題に対応するために作られた。リーダー・フォロワー(leader-follower、worker)分散システム設計パターンと**system prevalence**設計パターンを組み合わせ、この組み合わせにより厳密に一度(exactly-once)のセマンティクスで正しさを保証する非常に大規模なトランザクション的データパイプラインを実現する。(Source: [[@2016__OReilly__SRE Book - Chapter 25 Data Processing Pipelines]])
同名の一般語「workflow」との混同を避けるため、wiki内ではこのentityを「Google Workflow」と表記する(原名は "Workflow")。
## アーキテクチャ: MVCパターンの分散システムへの翻案
system prevalenceの仕組みゆえに、WorkflowはユーザーインターフェースにおけるMVC(モデル・ビュー・コントローラ)パターンの分散システム版として理解できる。
- **モデル**: **Task Master**というサーバ。全ジョブ状態をメモリに保持しつつ、変更を同期的にディスクへジャーナリングするsystem prevalenceパターンを用いる。最良の性能は、パイプラインデータ本体ではなく作業へのポインタのみをTask Masterに保持し、実際の入出力データを共通ファイルシステム等の別ストレージに置いたときに得られる。
- **ビュー**: ワーカー。マスタと状態を同期更新し続ける、パイプラインのサブコンポーネントとしての立場からの視点を持つ。この設計により、ワーカーは完全にステートレスでいつでも破棄可能になる。
- **コントローラ**(任意): 実行時のスケーリング・スナップショット取得・作業サイクル状態制御・パイプライン状態のロールバック・事業継続性のためのグローバルな介入といった補助的な活動を担う、任意で追加できる第三のコンポーネント。
(Source: [[@2016__OReilly__SRE Book - Chapter 25 Data Processing Pipelines]])
## 4つの正しさの保証
Workflowはパイプラインの深さをTask Master内のタスクグループ(パイプラインの1ステージに対応)への細分化によって任意に増やせる。ワーカーはwork unitをリース(lease)で取得し、有効なリースを保持する場合のみコミットできる。孤立(orphaned)したワーカーが正当なワーカーの成果を破壊しないよう、各ワーカーが開く出力ファイルには一意な名前が与えられる。さらに全タスクはバージョン管理され、configuration taskの変更がバリアとして機能し、旧設定を使っていたワーカーはコミットできなくなる。最終的にWorkflowは以下の4つの正しさの保証を持つ。
1. configuration taskによるバリア(作業の前提となる設定変更をバリアとして機能させる)
2. ワーカーが保持する有効なリース
3. ワーカーによる出力ファイルの一意な命名
4. server token(Task Master固有の一意な識別子)によるクライアント・サーバ双方でのTask Master検証
(Source: [[@2016__OReilly__SRE Book - Chapter 25 Data Processing Pipelines]])
## 事業継続性(business continuity)
Workflowはグローバルな整合性を得るため、Task Masterのジャーナルを、グローバルに利用可能で一貫性がありながら低スループットなファイルシステムとして[[Spanner]]上に保存する。どのTask Masterが書き込み可能かを決めるため、各Task Masterは分散ロックサービス[[Chubby]]を使ってライターを選出し、その結果をSpannerに永続化する。クライアントは内部のネーミングサービスを使って現在のTask Masterを検索する。
Spannerは高スループットなファイルシステムには向かないため、グローバルに分散したWorkflowは異なるクラスタで動く2つ以上のローカルWorkflowに加え、グローバルWorkflow内の「参照タスク」という概念を用いる。work unit(タスク)が消費されるにつれ、対応する参照タスクが「stage 1」と呼ばれるヘルパーバイナリによってグローバルWorkflowへ挿入され、タスクが完了すると参照タスクはトランザクショナルにグローバルWorkflowから削除される。このヘルパーバイナリはMVCの意味での「コントローラ」として振る舞い、グローバルWorkflow内の特別なハートビートタスクの更新も担う。ハートビートタスクがタイムアウト期間内に更新されないと、リモートWorkflowのヘルパーバイナリが参照タスクに記録された進行中の作業を引き継ぐことでフェイルオーバーを自動化する。(Source: [[@2016__OReilly__SRE Book - Chapter 25 Data Processing Pipelines]])
## 関連
- ソース: [[@2016__OReilly__SRE Book - Chapter 25 Data Processing Pipelines]]
- エンティティ: [[Google]] / [[Dan Dennison]] / [[Spanner]] / [[Chubby]]
- 概念: [[周期パイプライン]]
## 出典
- [[@2016__OReilly__SRE Book - Chapter 25 Data Processing Pipelines]]