Workflow engine with go
by
Tsuji Daishiro
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
ワークフローエンジンをGoで作る 2020/01/25 Umeda.go 2020 Winter 辻大志郎 @d_tutuz
Slide 2
Slide 2 text
No content
Slide 3
Slide 3 text
Who are you? ● 辻 大志郎(つじ だいしろう) @d_tutuz 渋谷区役所(~2014/9) Future Architect(2014/10~) ● 所属 Technology Innovation Group 競技プログラミング部
Slide 4
Slide 4 text
ワークフローエンジンとは 以下のようなことを実施するソフトウェア ● 定期的なタスクの実行 ● タスク間の依存関係を定義でき、順序関係を制御してタスクを実行 ● タスクの実行状況/結果を管理
Slide 5
Slide 5 text
データ分析基盤などでよく用いられる ● 定型業務の自動化 ○ 大量のデータの収集 ○ データの加工 ○ データの集計
Slide 6
Slide 6 text
用語の定義(タスクとフロー) ● タスク:処理の単位 ● フロー:タスクの集合 タスク フロー データソース データレイク データマート タスク タスク
Slide 7
Slide 7 text
既存のワークフローエンジン ● たくさんある ○ airflow ○ argo ○ rundeck ○ cadence ○ azkaban ○ JP1 ○ … ● 十分に高機能&汎用的だが、扱いにくかったり... ● ワークフローは業務と密に結合することが多い ● シンプルなワークフローエンジンを作ってみたかった
Slide 8
Slide 8 text
Flowerを作った ● フロー(Flow)を扱うソフトウェア(er)ということでFlower https://github.com/d-tsuji/flower
Slide 9
Slide 9 text
アーキテクチャ ● Register(タスクの実行登録) ● Watcher(タスクの実行監視/制御) ● Worker(タスクの実行)
Slide 10
Slide 10 text
Flowerの特徴 ● タスク管理 ○ タスクの順序をマスタで一括管理 ○ パラメータなどの埋め込みが可能 ○ タスクを構成する処理はComponentとしてGoで実装 ● リカバリ/リラン ○ エラー時にどのタスクでエラーになったかわかる仕組みを提供 ○ テーブルのレコード更新でリランが可能 ● 重複実行制御 ● 流量制御
Slide 11
Slide 11 text
タスクの定義方法 ● AirflowではPythonファイルとして処理と実行順序を記述 ● タスクはGoのソースで、実行順序はマスタで管理できるようにしたかった タスク定義例 タスク例 タスク定義マスタ
Slide 12
Slide 12 text
タスク実行管理/制御 ● タスクは管理テーブルで永続化 ○ タスクのロスト、重複実行の制御は最重要な要素の一つ ○ RDBMSが一番扱いやすい タスク管理テーブル exec_status 0:実行待ち 1:実行中 3:完了
Slide 13
Slide 13 text
重複実行制御 ● 実行待ちタスクの行ロックを取得してから実行中に更新 ● 実行中にステータスを更新して、workerにタスクをput ● 同時に実行待ちタスクが参照されて二重にタスクが実行されることを防止 次に実行するタスクはこ のレコード 完了 実行待
Slide 14
Slide 14 text
流量制御 ● 「実行中+実行待ちのタスク≦同時実行数」の場合はworkerにputしない 完了 実行中 実行中 実行待 実行待 例)同時実行数が2の場合 同時実行数を超えるので zzzzzのフローのタスクは実行しない
Slide 15
Slide 15 text
落ち葉拾い ● タスク監視のポーリング ○ キュー(SQSとか)をはさめばイベント通知にできる ● スケジューラ ● 管理コンソール ○ ほしいけど作っていない