swf

58
Amazon SWF を用いた タスク実行機構の模索 @rf0444

Upload: rf0444

Post on 30-Jun-2015

306 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: SWF

Amazon SWF を用いた タスク実行機構の模索

!@rf0444

Page 2: SWF

Amazon SWF とは

Amazon Simple Workflow Service

タスク実行用のキューと、現在のタスクの状態管理を提供

実行完了したタスクの状態ログを一定期間保管

Page 3: SWF

SQSとの比較SQS SWF

提供してくれるもの

メッセージキュー一連の処理の流れ

(ワークフロー)の管理

順序 保証しない ワークフロー内で保証

キューからの 削除

指定時間だけ不可視 その間に手動で削除

取得の際に削除される

実行保証 少なくとも1つ ただ1つ

信頼性保証 キューに入れたメッセージが勝手に消えない

ワークフローが途中で 勝手に消えない

Page 4: SWF

ワークフロー

バックアップ開始

例: バックアップ

バックアップ完成待ち 復元確認

Page 5: SWF

ワークフロー例: バックアップ

“バックアップ” 実行が 投入されました

Page 6: SWF

ワークフロー例: バックアップ

「さて、何しましょう?」

Page 7: SWF

ワークフロー例: バックアップ

「まだ何もしていないので、 次は ”バックアップ開始” タスクを

してください」

イベントログ

1 ”バックアップ” 実行が 投入されました

Decider

Page 8: SWF

ワークフロー

バックアップ開始

例: バックアップ

「”バックアップ開始”タスクを実行してください」

Page 9: SWF

ワークフロー

バックアップ開始

例: バックアップ

Worker「あいよ」

Page 10: SWF

ワークフロー

バックアップ開始

例: バックアップ

Worker

「てことでよろしく」

なんとかサーバ

「あいよ」

Page 11: SWF

ワークフロー

バックアップ開始

例: バックアップ

Worker「”バックアップ開始”タスク終わったよ」

Page 12: SWF

ワークフロー例: バックアップ

「さて、次は何しましょう?」

バックアップ開始

Page 13: SWF

ワークフロー例: バックアップ

バックアップ開始

「”バックアップ開始” タスクまで 終わっているので、

次は “バックアップ完成待ち”タスクを してください」

イベントログ

1 ”バックアップ” 実行が 投入されました

2 “バックアップ開始”タスクが終了しました

Decider

Page 14: SWF

ワークフロー

バックアップ開始

例: バックアップ

「”バックアップ完成待ち”タスクを実行してください」

バックアップ完成待ち

Page 15: SWF

ワークフロー

バックアップ開始

例: バックアップ

バックアップ完成待ち

Worker「あいよ」

Page 16: SWF

ワークフロー

バックアップ開始

例: バックアップ

バックアップ完成待ち

Worker

なんとかサーバ

「まだだよ」

「バックアップ終わった?」

Page 17: SWF

ワークフロー

バックアップ開始

例: バックアップ

バックアップ完成待ち

Worker

「少し待つか」

Page 18: SWF

ワークフロー

バックアップ開始

例: バックアップ

バックアップ完成待ち

Worker

1時間後…

Page 19: SWF

ワークフロー

バックアップ開始

例: バックアップ

バックアップ完成待ち

Worker

なんとかサーバ

「終わったよ」

「バックアップ終わった?」

Page 20: SWF

ワークフロー

バックアップ開始

例: バックアップ

バックアップ完成待ち

Worker「”バックアップ完成待ち”タスク

終わったよ」

Page 21: SWF

ワークフロー例: バックアップ

「さて、次は何しましょう?」

バックアップ開始 バックアップ完成待ち

Page 22: SWF

ワークフロー例: バックアップ

バックアップ開始 バックアップ完成待ち

(中略)

Page 23: SWF

ワークフロー例: バックアップ

「さて、次は何しましょう?」

バックアップ開始 復元確認バックアップ完成待ち

Page 24: SWF

ワークフロー例: バックアップ

バックアップ開始 復元確認バックアップ完成待ち

Decider

イベントログ

1 ”バックアップ” 実行が 投入されました

2 “バックアップ開始” タスクが終了しました

3 “バックアップ完成待ち” タスクが終了しました

4 “復元確認” タスクが終了しました

「全てのタスクが終了しているので、

“バックアップ” 実行はこれで終了です」

Page 25: SWF

ワークフロー

バックアップ開始

例: バックアップ

バックアップ完成待ち 復元確認

Page 26: SWF

ワークフロー

バックアップ開始

例: バックアップ

バックアップ完成待ち 復元確認

イベントログ

1 ”バックアップ” 実行が 投入されました

2 “バックアップ開始” タスクが終了しました

3 “バックアップ完成待ち” タスクが終了しました

4 “復元確認” タスクが終了しました

5 ”バックアップ” 実行が 終了しました

Page 27: SWF

Decider の実装

Decider

SWFDecisionTask List

ActivityTask List

Page 28: SWF

SWF

Decider の実装

DeciderDecisionTask List PollForDecisionTask

DecisionTask List に要素があれば、 先頭1件を取ってくる。

なければ、最大1分間繋ぎ続けて 要素が入ってくるのを待つ。 待っても入ってこなければ、

taskToken (後述)が空の DecisionTask を返す。

ActivityTask List

Page 29: SWF

SWF

Decider

Decider の実装

PollForDecisionTaskDecisionTask List

ActivityTask List

Page 30: SWF

SWF

Decider

Decider の実装

PollForDecisionTask

DecisionTask: taskToken: この DecisionTask の識別子 events: イベントログ

DecisionTask List

ActivityTask List

Page 31: SWF

SWF

Decider

Decider の実装DecisionTask List

taskToken: 取得した DecisionTask の識別子 decisions: 判断のリスト。普通1つ

RespondDecisionTaskCompleted

判断 (一部)ScheduleActivityTask 次のタスクを登録CompleteWorkflowExecution この実行を終了(成功)FailWorkflowExecution この実行を終了(失敗)CancelWorkflowExecution この実行を終了(キャンセル)

ActivityTask List

Page 32: SWF

SWF

Decider

Decider の実装DecisionTask List

taskToken: 取得した DecisionTask の識別子 decisions: 判断のリスト。普通1つ

RespondDecisionTaskCompleted

判断 (一部)ScheduleActivityTask 次のタスクを登録CompleteWorkflowExecution この実行を終了(成功)FailWorkflowExecution この実行を終了(失敗)CancelWorkflowExecution この実行を終了(キャンセル)

ActivityTask List

Page 33: SWF

SWF

Worker の実装

Worker

DecisionTask List

ActivityTask List PollForActivityTask

ActivityTask List に要素があれば、 先頭1件を取ってくる。

なければ、最大1分間繋ぎ続けて 要素が入ってくるのを待つ。 待っても入ってこなければ、

taskToken が空の ActivityTask を返す。

Page 34: SWF

SWF

Worker の実装

Worker

DecisionTask List

ActivityTask List PollForActivityTask

ActivityTask: taskToken: この ActivityTask の識別子 activityType: 実行種別 input: ActivityTask 登録時の入力(あれば)

Page 35: SWF

SWF

Worker の実装

Worker

DecisionTask List

ActivityTask List

RespondActivityTaskCompleted: タスクが正常に終了 !RespondActivityTaskFailed: タスクの実行に失敗 !RespondActivityTaskCanceled: タスクの実行がキャンセルされた

Page 36: SWF

内部実装SWF

Task List

Decider/Worker

Page 37: SWF

固定 ActorSWF

Task List

Decider/Workerpoll

respond

poll

respond

poll

respond

work

work

work

Page 38: SWF

固定 Actor

固定数の作業者を用意し、作業者内でタスクの取得/実行/返信を行う

一度に大量にタスクが投入された場合、作業者数が少ないと完了に時間がかかる

Page 39: SWF

無制限 ActorSWF

Task List

Decider/Worker

poll

Page 40: SWF

無制限 ActorSWF

Task List

Decider/Worker

work

delegate

Page 41: SWF

無制限 ActorSWF

Task List

Decider/Worker

poll

work

Page 42: SWF

無制限 ActorSWF

Task List

Decider/Worker

work

delegatework

Page 43: SWF

無制限 ActorSWF

Task List

Decider/Worker

work

work

.

.

.

Page 44: SWF

無制限 ActorSWF

Task List

Decider/Worker

work

work

.

.

.

respond

Page 45: SWF

無制限 ActorSWF

Task List

Decider/Worker

work

.

.

.

Page 46: SWF

無制限 Actor

とれるだけ取ってきて、その度に作業者を作る

一度に大量にタスクが投入された場合、作業者でリソースを食い尽くす

Page 47: SWF

制限付き ActorSWF

Task List

Decider/Worker

poll

(limit = 2)

work

work

Page 48: SWF

制限付き ActorSWF

Task List

Decider/Worker

work

work

(limit = 2)

enqueue

Page 49: SWF

制限付き ActorSWF

Task List

Decider/Worker

work

work

(limit = 2)

poll

Page 50: SWF

制限付き ActorSWF

Task List

Decider/Worker

work

work

(limit = 2)

enqueue

Page 51: SWF

制限付き ActorSWF

Task List

Decider/Worker

work

(limit = 2)

enqueue

Page 52: SWF

制限付き ActorSWF

Task List

Decider/Worker

work

(limit = 2)

dequeue

work

delegate

Page 53: SWF

制限付き Actorとれるだけ取ってくるが、作業者が一杯なら一旦貯めておく

SWF と内部キューの二重管理

沢山貯まっているときに死ぬとやばい

Page 54: SWF

取得制限付き ActorSWF

Task List

Decider/Worker

(limit = 2)

work

work

Page 55: SWF

取得制限付き ActorSWF

Task List

Decider/Worker

(limit = 2)

work

Page 56: SWF

取得制限付き ActorSWF

Task List

Decider/Worker

(limit = 2)

workpoll

Page 57: SWF

取得制限付き ActorSWF

Task List

Decider/Worker

(limit = 2)

work

work

delegate

Page 58: SWF

取得制限付き Actor

作業者が一杯なら、タスクを取ってこない

作業者の作業が終わったら、タスクを取ってくる