$30 off During Our Annual Pro Sale. View Details »

Amazon SWF for Ruby

kbaba1001
September 03, 2012

Amazon SWF for Ruby

kbaba1001

September 03, 2012
Tweet

More Decks by kbaba1001

Other Decks in Programming

Transcript

  1. Amazon SWF for Ruby 2012/09/03   馬場 一樹

  2. 本日の内容 •  SWFの動き   •  苦労した点

  3. SWFの動き

  4. h,p://docs.amazonwebservices.com/amazonswf/latest/developerguide/swf-­‐dg-­‐basic.html#swf-­‐dev-­‐actors   登場人物

  5. Decider AcGvity   Worker SWF   Workflow   Starter Domain

    History   (履歴) Deciderと深く関わる部分 AcGvityと深く関わる部分 Workflow  ExecuGonと深く   関わる部分 Workflow  ExecuGonを   スタートする WorkflowType AcGvityType ポーリング ポーリング Workflow   ExecuGon 1 1 読み込む Decision   Task  Lists Decision   Task AcGvity   Task  Lists AcGvity   Task 生成 生成 概要 SWFが行ったことをイベント として記録する スケジュール
  6. Decider AcGvity   Worker SWF   Workflow   Starter Domain

    Decision   Task  Lists AcGvity   Task  Lists Deciderと深く関わる部分 AcGvityと深く関わる部分 Workflow  ExecuGonと深く   関わる部分 WorkflowType AcGvityType 初期状態
  7. Decider AcGvity   Worker SWF   Workflow   Starter Domain

    History Decision   Task  Lists AcGvity   Task  Lists Deciderと深く関わる部分 AcGvityと深く関わる部分 Workflow  ExecuGonと深く   関わる部分 WorkflowType#start_   execuGon   WorkflowType AcGvityType Workflow   ExecuGon •  Workflow  ID   •  Input  (文字列)   •  WorkflowType  識別子   •  WorkflowType  変更値   •  タイムアウト •  Name   •  Version   •  Default  Task  List   •  Default  Child  Policy   •  デフォルトタイムアウト Workflow Execution
  8. SWF   Workflow   Starter Domain History Decision  Task  Lists

    Deciderと深く関わる部分 Workflow  ExecuGonと深く   関わる部分 WorkflowType Workflow   ExecuGon •  Name   •  Version   •  Default  Task  List   •  Default  Child  Policy   •  デフォルトタイムアウト DecisionTaskの生成 Queue Decision  Task  List  1 Queue Decision  Task  List  2 Queue Decision  Task  List  3 ・・・ ・・・ •  Workflow  ID   •  Input   •  WorkflowType  識別子   •  WorkflowType  変更値   •  タイムアウト
  9. SWF   Workflow   Starter Domain Decision  Task  Lists Deciderと深く関わる部分

    Workflow  ExecuGonと深く   関わる部分 WorkflowType Workflow   ExecuGon DecisionTaskの生成 Queue Decision  Task  List  1 Queue Decision  Task  List  2 Queue Decision  Task  List  3 ・・・ ・・・ History   WorkflowExecuGonStarted   DecisionTaskScheduled Decision  Task   •  完了/失敗/Cancel   •  History参照   •  Workflowの終了   •  AcGvityTaskの開始
  10. Workflow Starter workflow_type  =  domain.workflow_types['my-­‐long-­‐processes',  1.0]     workflow_type.start_execuGon(  

           workflow_id:                                                                                    Time.now.str^ime('%Y%m%d%H%M%S'),          task_list:                                                                                                    ’decision-­‐task-­‐list-­‐1',          execuGon_start_to_close_Gmeout:      30.minute,          task_start_to_close_Gmeout:                          10.minute   )     workflow_idを省略するとUUIDになる。   task_listを省略するとWorkflowTypeのDefault_task_listが使われる。
  11. SWF   Domain Deciderと深く関わる部分 Workflow  ExecuGonと深く   関わる部分 WorkflowType Workflow

      ExecuGon Decider (DecisionTaskの取得) Decision  Task  Lists Queue Decision  Task  List  1 Queue Decision  Task  List  2 Queue Decision  Task  List  3 ・・・ ・・・ Decider ポーリング 1つのDecision  Task  Listを   ポーリングし続ける リストにタスクがあり、   イベントが   DecisionTaskScheduled   ならばタスクを取得できる History   WorkflowExecuGonStarted   DecisionTaskScheduled
  12. SWF   Domain Deciderと深く関わる部分 Workflow  ExecuGonと深く   関わる部分 WorkflowType Workflow

      ExecuGon Decider Decision   Task Decider Decision  Task  Lists Queue Decision  Task  List  1 Queue Decision  Task  List  2 Queue Decision  Task  List  3 ・・・ ・・・ History   WorkflowExecuGonStarted   DecisionTaskScheduled •  未読のイベントを読 む。   •  EventTypeにより条件 分岐する。   •  次に実行する AcGvityTaskを決定す る。   AcGvityと深く関わる部分 AcGvityType DecisionTask#schedule_   acGvity_task
  13. SWF   Domain ActivityWorker (ActivityTaskの生成) Decider AcGvityと深く関わる部分 AcGvityType AcGvity  Task

     Lists Queue hello-­‐task-­‐list Queue AcGvity  Task  List  2 Queue AcGvity  Task  List  3 ・・・ ・・・ DecisionTask#schedule_   acGvity_task AcGvity   Worker ポーリング Deciderと深く関わる部分 WorkflowType Workflow  ExecuGonと深く   関わる部分 Workflow   ExecuGon WorkflowExecuGonStarted   DecisionTaskScheduled   DecisionTaskStarted   DecisionTaskCompleted   AcGvityTaskScheduled History イベントが AcGvityTaskScheduled の時タスクを取得できる •  Name   •  Version   •  Default  Task  List   •  デフォルトタイムアウト
  14. SWF   Domain Deciderと深く関わる部分 Workflow  ExecuGonと深く   関わる部分 WorkflowType ActivityWorker

    Decider AcGvity   Worker AcGvity   Task  List AcGvityと深く関わる部分 AcGvityType AcGvityTask#Complete!   (resultという名前で文字 列を渡せる) WorkflowExecuGonStarted   DecisionTaskScheduled   DecisionTaskStarted   DecisionTaskCompleted   AcGvityTaskScheduled   AcGvityTaskStarted   AcGvityTaskCompleted   DecsionTaskScheduled History Workflow   ExecuGon Queue Decision  Task  List  1 Queue Decision  Task  List  2 ・・・ ・・・ Decision  Task  Lists ポーリング
  15. Deciderの実装 domain.decision_tasks.poll(’decision-­‐task-­‐list-­‐1')  do  |decision_task|          decision_task.new_events.each  do

     |event|                  case  event.event_type                  when  'WorkflowExecuGonStarted’                          decision_task.schedule_acGvity_task  domain.acGvity_types['hello',  1.0]                  when  'AcGvityTaskCompleted’                          case  completed_acGvity_type(task).name          #  完了したAcGvityTypeを取得                          when  'hello’                                  decision_task.schedule_acGvity_task  domain.acGvity_types['world',  1.0]                          when  ‘world’                                  #  …                          else                                  task.complete_workflow_execuGon                          end                  end          end   end WorkflowExecuGonStarted   DecisionTaskScheduled   DecisionTaskStarted   DecisionTaskCompleted   AcGvityTaskScheduled   AcGvityTaskStarted   AcGvityTaskCompleted   DecsionTaskScheduled History 1回目 2回目
  16. completed_activity_typeメソッドはなぜ必要か <AWS::SimpleWorkflow::HistoryEvent{   :event_type=>"AcGvityTaskScheduled”,        :event_id=>5,   :a,ributes=>

     {      :acGvity_id=>"8e42e913-­‐c2f3-­‐475c-­‐8618-­‐8eaeca2b4590",      :acGvity_type=>  <AWS::SimpleWorkflow::AcGvityType  domain:my-­‐domain  name:hello  version:1.0>,      :decision_task_completed_event_id=>4,    …(後略)   }}>     <AWS::SimpleWorkflow::HistoryEvent  {  :event_type=>"AcGvityTaskStarted”,        :event_id=>6,  …(後略)  }}>     <AWS::SimpleWorkflow::HistoryEvent  {   :event_type=>"AcGvityTaskCompleted”,        :event_id=>7,   :a,ributes=>  {          :scheduled_event_id=>5,          :started_event_id=>6   }}> WorkflowExecuGonStarted   DecisionTaskScheduled   DecisionTaskStarted   DecisionTaskCompleted   AcGvityTaskScheduled   AcGvityTaskStarted   AcGvityTaskCompleted   DecsionTaskScheduled History AcGvityTaskCompletedを処理するときに、   AcGvityTypeの情報がほしい
  17. ActivityWorkerの実装 domain.acGvity_tasks.poll('hello-­‐task-­‐list')  do  |acGvity_task|          case  acGvity_task.acGvity_type.name

             when  'hello'                  puts  ’hello’                  acGvity_task.complete!  result:  ‘任意の文字列’          else                  acGvity_task.fail!  reason:  'unknown  acGvity  task  type'          end   end
  18. 苦労した点

  19. ざっくり言えば・・・ •  用語がわかりづらい   •  AWS  SDK  for  Ruby  の

     SWF  が未熟  
  20. Type と Task の違い Type  は  Task  のデフォルト値。Type  の名前と バージョン以外は

     Task  生成時に変更可能。 WorkflowType WorkflowType#   start_execuGon Decision   Task デフォルト値 生成する 値を変更する Decider ポーリング AcGvityType AcGvity   Task デフォルト値 生成する 値を変更する AcGvity   Worker ポーリング DecisionTask#sche dule_acGvity_task Workflow  Starter Decider
  21. Workflow と Decision の使い分けが曖昧 WorkflowType  が DecisionTask  のデフォルト値を設定しているので混乱し やすい。Workflow  はシステムの実行単位であり、DecisionTask

     は  SWF  と   Decider  のやり取りの単位。 存在期間 SWF   Decider   AcGvityWorker Workflow DecisionTask AcGvityTask
  22. Task List の実態がわかりづらい WorkflowType  の定義 Decider Task  List  はコード中では単なる文字列として  

    登場するだけ。
  23. SDK中に便利なメソッドが少ない •  DeciderでHistoryを自力で解析しなければならない。   •  AcGvityTaskCollecGonとかHistoryEventCollecGonなどのク ラスが存在するが、単なるEnumerableと大差ない。   •  each

     と  case  が合わさってネストが深くなりがち。   domain.decision_tasks.poll(’decision-­‐task-­‐list-­‐1')  do  |decision_task|          decision_task.new_events.each  do  |event|                  case  event.event_type                  when  'WorkflowExecuGonStarted’                          decision_task.schedule_acGvity_task  domain.acGvity_types['hello',  1.0]                  when  'AcGvityTaskCompleted’                          case  completed_acGvity_type(task).name                          when  'hello’                                  decision_task.schedule_acGvity_task  domain.acGvity_types['world',  1.0]                          when  ‘world’                                  #  …  (後略)  
  24. 参考資料 •  AWS  SDK  for  Ruby  の RDocs   h,p://docs.amazonwebservices.com/AWSRubySDK/

    latest/AWS/SimpleWorkflow.html   •  Amazon  Simple  Workflow  Service  Developer   Guide   h,p://docs.amazonwebservices.com/amazonswf/latest/ developerguide/swf-­‐welcome.html   •  Amazon  Web  Services  ブログ   h,p://aws.typepad.com/aws_japan/2012/02/amazon-­‐ simpleworkflow-­‐cloud-­‐based-­‐workflow-­‐management.html  
  25. AWS.config(アカウント情報)   swf  =  AWS::SimpleWorkflow.new     domain  =  swf.domains.create('my-­‐domain',

     1)     domain.workflow_types.create(          'my-­‐long-­‐processes',          '1.0',          default_task_list:                                                                                                'decision-­‐task-­‐list-­‐1',          default_child_policy:                                                                                  :request_cancel,          default_task_start_to_close_Gmeout:                      10.minute,          default_execuGon_start_to_close_Gmeout:  1.hour   )     domain.acGvity_types.create(          'do-­‐something',          '1.0',          default_task_list:                                                                                              'hello-­‐task-­‐list',          default_task_heartbeat_Gmeout:                                    2.minute,          default_task_schedule_to_start_Gmeout:      5.minute,          default_task_schedule_to_close_Gmeout:    15.minute,          default_task_start_to_close_Gmeout:                    10.minute   )