Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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. 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が行ったことをイベント として記録する スケジュール
  2. Decider AcGvity   Worker SWF   Workflow   Starter Domain

    Decision   Task  Lists AcGvity   Task  Lists Deciderと深く関わる部分 AcGvityと深く関わる部分 Workflow  ExecuGonと深く   関わる部分 WorkflowType AcGvityType 初期状態
  3. 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
  4. 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  変更値   •  タイムアウト
  5. 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の開始
  6. 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が使われる。
  7. 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
  8. 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
  9. 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   •  デフォルトタイムアウト
  10. 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 ポーリング
  11. 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回目
  12. 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の情報がほしい
  13. 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
  14. 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
  15. 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’                                  #  …  (後略)  
  16. 参考資料 •  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  
  17. 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   )