Workflow engine with go

Workflow engine with go

164fd510e92a1912155b869b2c333c1e?s=128

Tsuji Daishiro

January 25, 2020
Tweet

Transcript

  1. ワークフローエンジンをGoで作る 2020/01/25 Umeda.go 2020 Winter 辻大志郎 @d_tutuz

  2. None
  3. Who are you? • 辻 大志郎(つじ だいしろう) @d_tutuz 渋谷区役所(~2014/9) Future

    Architect(2014/10~) • 所属 Technology Innovation Group 競技プログラミング部
  4. ワークフローエンジンとは 以下のようなことを実施するソフトウェア • 定期的なタスクの実行 • タスク間の依存関係を定義でき、順序関係を制御してタスクを実行 • タスクの実行状況/結果を管理

  5. データ分析基盤などでよく用いられる • 定型業務の自動化 ◦ 大量のデータの収集 ◦ データの加工 ◦ データの集計

  6. 用語の定義(タスクとフロー) • タスク:処理の単位 • フロー:タスクの集合 タスク フロー データソース データレイク データマート

    タスク タスク
  7. 既存のワークフローエンジン • たくさんある ◦ airflow ◦ argo ◦ rundeck ◦

    cadence ◦ azkaban ◦ JP1 ◦ … • 十分に高機能&汎用的だが、扱いにくかったり... • ワークフローは業務と密に結合することが多い • シンプルなワークフローエンジンを作ってみたかった
  8. Flowerを作った • フロー(Flow)を扱うソフトウェア(er)ということでFlower https://github.com/d-tsuji/flower

  9. アーキテクチャ • Register(タスクの実行登録) • Watcher(タスクの実行監視/制御) • Worker(タスクの実行)

  10. Flowerの特徴 • タスク管理 ◦ タスクの順序をマスタで一括管理 ◦ パラメータなどの埋め込みが可能 ◦ タスクを構成する処理はComponentとしてGoで実装 •

    リカバリ/リラン ◦ エラー時にどのタスクでエラーになったかわかる仕組みを提供 ◦ テーブルのレコード更新でリランが可能 • 重複実行制御 • 流量制御
  11. タスクの定義方法 • AirflowではPythonファイルとして処理と実行順序を記述 • タスクはGoのソースで、実行順序はマスタで管理できるようにしたかった タスク定義例 タスク例 タスク定義マスタ

  12. タスク実行管理/制御 • タスクは管理テーブルで永続化 ◦ タスクのロスト、重複実行の制御は最重要な要素の一つ ◦ RDBMSが一番扱いやすい タスク管理テーブル exec_status 0:実行待ち

    1:実行中 3:完了
  13. 重複実行制御 • 実行待ちタスクの行ロックを取得してから実行中に更新 • 実行中にステータスを更新して、workerにタスクをput • 同時に実行待ちタスクが参照されて二重にタスクが実行されることを防止 次に実行するタスクはこ のレコード 完了

    実行待
  14. 流量制御 • 「実行中+実行待ちのタスク≦同時実行数」の場合はworkerにputしない 完了 実行中 実行中 実行待 実行待 例)同時実行数が2の場合  同時実行数を超えるので

    zzzzzのフローのタスクは実行しない
  15. 落ち葉拾い • タスク監視のポーリング ◦ キュー(SQSとか)をはさめばイベント通知にできる • スケジューラ • 管理コンソール ◦

    ほしいけど作っていない