swf
TRANSCRIPT
Amazon SWF を用いた タスク実行機構の模索
!@rf0444
Amazon SWF とは
Amazon Simple Workflow Service
タスク実行用のキューと、現在のタスクの状態管理を提供
実行完了したタスクの状態ログを一定期間保管
SQSとの比較SQS SWF
提供してくれるもの
メッセージキュー一連の処理の流れ
(ワークフロー)の管理
順序 保証しない ワークフロー内で保証
キューからの 削除
指定時間だけ不可視 その間に手動で削除
取得の際に削除される
実行保証 少なくとも1つ ただ1つ
信頼性保証 キューに入れたメッセージが勝手に消えない
ワークフローが途中で 勝手に消えない
ワークフロー
バックアップ開始
例: バックアップ
バックアップ完成待ち 復元確認
ワークフロー例: バックアップ
“バックアップ” 実行が 投入されました
ワークフロー例: バックアップ
「さて、何しましょう?」
ワークフロー例: バックアップ
「まだ何もしていないので、 次は ”バックアップ開始” タスクを
してください」
イベントログ
1 ”バックアップ” 実行が 投入されました
Decider
ワークフロー
バックアップ開始
例: バックアップ
「”バックアップ開始”タスクを実行してください」
ワークフロー
バックアップ開始
例: バックアップ
Worker「あいよ」
ワークフロー
バックアップ開始
例: バックアップ
Worker
「てことでよろしく」
なんとかサーバ
「あいよ」
ワークフロー
バックアップ開始
例: バックアップ
Worker「”バックアップ開始”タスク終わったよ」
ワークフロー例: バックアップ
「さて、次は何しましょう?」
バックアップ開始
ワークフロー例: バックアップ
バックアップ開始
「”バックアップ開始” タスクまで 終わっているので、
次は “バックアップ完成待ち”タスクを してください」
イベントログ
1 ”バックアップ” 実行が 投入されました
2 “バックアップ開始”タスクが終了しました
Decider
ワークフロー
バックアップ開始
例: バックアップ
「”バックアップ完成待ち”タスクを実行してください」
バックアップ完成待ち
ワークフロー
バックアップ開始
例: バックアップ
バックアップ完成待ち
Worker「あいよ」
ワークフロー
バックアップ開始
例: バックアップ
バックアップ完成待ち
Worker
なんとかサーバ
「まだだよ」
「バックアップ終わった?」
ワークフロー
バックアップ開始
例: バックアップ
バックアップ完成待ち
Worker
「少し待つか」
ワークフロー
バックアップ開始
例: バックアップ
バックアップ完成待ち
Worker
1時間後…
ワークフロー
バックアップ開始
例: バックアップ
バックアップ完成待ち
Worker
なんとかサーバ
「終わったよ」
「バックアップ終わった?」
ワークフロー
バックアップ開始
例: バックアップ
バックアップ完成待ち
Worker「”バックアップ完成待ち”タスク
終わったよ」
ワークフロー例: バックアップ
「さて、次は何しましょう?」
バックアップ開始 バックアップ完成待ち
ワークフロー例: バックアップ
バックアップ開始 バックアップ完成待ち
(中略)
ワークフロー例: バックアップ
「さて、次は何しましょう?」
バックアップ開始 復元確認バックアップ完成待ち
ワークフロー例: バックアップ
バックアップ開始 復元確認バックアップ完成待ち
Decider
イベントログ
1 ”バックアップ” 実行が 投入されました
2 “バックアップ開始” タスクが終了しました
3 “バックアップ完成待ち” タスクが終了しました
4 “復元確認” タスクが終了しました
「全てのタスクが終了しているので、
“バックアップ” 実行はこれで終了です」
ワークフロー
バックアップ開始
例: バックアップ
バックアップ完成待ち 復元確認
ワークフロー
バックアップ開始
例: バックアップ
バックアップ完成待ち 復元確認
イベントログ
1 ”バックアップ” 実行が 投入されました
2 “バックアップ開始” タスクが終了しました
3 “バックアップ完成待ち” タスクが終了しました
4 “復元確認” タスクが終了しました
5 ”バックアップ” 実行が 終了しました
Decider の実装
Decider
SWFDecisionTask List
ActivityTask List
SWF
Decider の実装
DeciderDecisionTask List PollForDecisionTask
DecisionTask List に要素があれば、 先頭1件を取ってくる。
なければ、最大1分間繋ぎ続けて 要素が入ってくるのを待つ。 待っても入ってこなければ、
taskToken (後述)が空の DecisionTask を返す。
ActivityTask List
SWF
Decider
Decider の実装
PollForDecisionTaskDecisionTask List
ActivityTask List
SWF
Decider
Decider の実装
PollForDecisionTask
DecisionTask: taskToken: この DecisionTask の識別子 events: イベントログ
DecisionTask List
ActivityTask List
SWF
Decider
Decider の実装DecisionTask List
taskToken: 取得した DecisionTask の識別子 decisions: 判断のリスト。普通1つ
RespondDecisionTaskCompleted
判断 (一部)ScheduleActivityTask 次のタスクを登録CompleteWorkflowExecution この実行を終了(成功)FailWorkflowExecution この実行を終了(失敗)CancelWorkflowExecution この実行を終了(キャンセル)
ActivityTask List
SWF
Decider
Decider の実装DecisionTask List
taskToken: 取得した DecisionTask の識別子 decisions: 判断のリスト。普通1つ
RespondDecisionTaskCompleted
判断 (一部)ScheduleActivityTask 次のタスクを登録CompleteWorkflowExecution この実行を終了(成功)FailWorkflowExecution この実行を終了(失敗)CancelWorkflowExecution この実行を終了(キャンセル)
ActivityTask List
SWF
Worker の実装
Worker
DecisionTask List
ActivityTask List PollForActivityTask
ActivityTask List に要素があれば、 先頭1件を取ってくる。
なければ、最大1分間繋ぎ続けて 要素が入ってくるのを待つ。 待っても入ってこなければ、
taskToken が空の ActivityTask を返す。
SWF
Worker の実装
Worker
DecisionTask List
ActivityTask List PollForActivityTask
ActivityTask: taskToken: この ActivityTask の識別子 activityType: 実行種別 input: ActivityTask 登録時の入力(あれば)
SWF
Worker の実装
Worker
DecisionTask List
ActivityTask List
RespondActivityTaskCompleted: タスクが正常に終了 !RespondActivityTaskFailed: タスクの実行に失敗 !RespondActivityTaskCanceled: タスクの実行がキャンセルされた
内部実装SWF
Task List
Decider/Worker
固定 ActorSWF
Task List
Decider/Workerpoll
respond
poll
respond
poll
respond
work
work
work
固定 Actor
固定数の作業者を用意し、作業者内でタスクの取得/実行/返信を行う
一度に大量にタスクが投入された場合、作業者数が少ないと完了に時間がかかる
無制限 ActorSWF
Task List
Decider/Worker
poll
無制限 ActorSWF
Task List
Decider/Worker
work
delegate
無制限 ActorSWF
Task List
Decider/Worker
poll
work
無制限 ActorSWF
Task List
Decider/Worker
work
delegatework
無制限 ActorSWF
Task List
Decider/Worker
work
work
.
.
.
無制限 ActorSWF
Task List
Decider/Worker
work
work
.
.
.
respond
無制限 ActorSWF
Task List
Decider/Worker
work
.
.
.
無制限 Actor
とれるだけ取ってきて、その度に作業者を作る
一度に大量にタスクが投入された場合、作業者でリソースを食い尽くす
制限付き ActorSWF
Task List
Decider/Worker
poll
(limit = 2)
work
work
制限付き ActorSWF
Task List
Decider/Worker
work
work
(limit = 2)
enqueue
制限付き ActorSWF
Task List
Decider/Worker
work
work
(limit = 2)
poll
制限付き ActorSWF
Task List
Decider/Worker
work
work
(limit = 2)
enqueue
制限付き ActorSWF
Task List
Decider/Worker
work
(limit = 2)
enqueue
制限付き ActorSWF
Task List
Decider/Worker
work
(limit = 2)
dequeue
work
delegate
制限付き Actorとれるだけ取ってくるが、作業者が一杯なら一旦貯めておく
SWF と内部キューの二重管理
沢山貯まっているときに死ぬとやばい
取得制限付き ActorSWF
Task List
Decider/Worker
(limit = 2)
work
work
取得制限付き ActorSWF
Task List
Decider/Worker
(limit = 2)
work
取得制限付き ActorSWF
Task List
Decider/Worker
(limit = 2)
workpoll
取得制限付き ActorSWF
Task List
Decider/Worker
(limit = 2)
work
work
delegate
取得制限付き Actor
作業者が一杯なら、タスクを取ってこない
作業者の作業が終わったら、タスクを取ってくる