开发 Amazon SWF 中的活动工作线程 - Amazon Simple Workflow Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

开发 Amazon SWF 中的活动工作线程

活动工作线程会执行一个或多个活动类型。活动工作人员与 Amazon SWF 通信以接收并执行活动任务。您可以有一队多个活动工作线程执行具有同一种活动类型的活动任务。

当决策者排定活动任务时,Amazon SWF 会将活动任务提供给活动工作人员。当决策者排定活动任务时,它会提供活动工作人员执行该活动任务所需的数据(此数据是由您来确定的)。Amazon SWF 会在将活动任务发送到活动工作人员之前,将这些数据插到活动任务中。

活动工作线程由您来管理。可以用任何语言编写活动工作线程。工作人员可在任何地点运行,只要它能通过 API 与 Amazon SWF 通信。由于 Amazon SWF 提供执行活动任务所需的所有信息,因此,所有活动工作人员都可以是无状态的。无状态性使您的工作流可以高度扩展;处理增长的容量需求并简单增加更多活动工作线程。

本章节说明了如何执行活动工作线程。活动工作线程应重复执行下列操作。

  1. 轮询以获取活动任务。

  2. 开始执行任务。

  3. 如果任务长时间运行,请定期向 Amazon SWF 报告检测信号。

  4. 报告任务已完成或失败并将结果返回到 Amazon SWF。

轮询活动任务

为执行活动任务,每个活动工作人员都必须定期调用PollForActivityTaskaction.

以下示例所示为,活动工作线程 ChargeCreditCardWorker01 轮询任务列表上的任务 ChargeCreditCard-v0.1。如果没有提供活动任务,则在 60 秒后,Amazon SWF 会将返回空响应。空响应是一个 Task 结构,在该结构中,taskToken 值为空字符串。

https://swf.us-east-1.amazonaws.com PollForActivityTask { "domain" : "867530901", "taskList" : { "name": "ChargeCreditCard-v0.1" }, "identity" : "ChargeCreditCardWorker01" }

如果活动任务变为可用,则 Amazon SWF 会将其返回给活动工作人员。任务中包含决策程序在其排定活动时指定的数据。

活动工作线程接收活动任务后就已作好执行工作的准备。下一节提供有关执行活动任务的信息。

执行活动任务

接收活动任务后,活动工作线程就做好了执行任何的准备。

要执行活动任务

  1. 给您的活动工作线程编程以说明任务输入字段中的内容。该字段中包含决策程序在排定任务时指定的数据。

  2. 给活动工作线程编程以开始处理数据并执行您的逻辑。

下一节说明了如何对活动工作人员进行编程以将长时间运行活动的状态更新提供给 Amazon SWF。

报告活动任务检测信号

如果在活动类型中注册了检测信号超时,则活动工作线程必须在超出检测信号超时之前记录检测信号。如果活动任务没有在超时时间内提供检测信号,则任务会超时,则 Amazon SWF 会将关闭该任务并安排新决策任务以将超时情况通知决策程序。然后,决策程序可重新排定活动任务或采取另一个操作。

如果活动工作线程在超时后尝试联系 Amazon SWF(如通过调用RespondActivityTaskCompleted,则亚马逊 SWF 将返回UnknownResource故障。

本章描述了提供活动检测信号的方法。

要记录活动任务检测信号,给您的活动工作线程编程以调用 RecordActivityTaskHeartbeat 操作。此操作还会提供字符串字段,您可以在该字段中存储自由格式的数据,从而量化以任何方式作用于您的应用程序的过程。

在此示例中,活动工作人员将检测信号报告给 Amazon SWF,并使用详细信息字段来报告该活动任务已完成 40%。要报告检测信号,活动工作线程必须指定活动任务的任务令牌。

https://swf.us-east-1.amazonaws.com RecordActivityTaskHeartbeat { "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "details" : "40" }

此操作本身不会在工作流执行历史记录中创建时间;但是,如果任务超时,工作流执行历史记录中将包含 ActivityTaskTimedOut 事件,该事件中包含活动工作线程生成的最后一个检测信号的信息。

完成活动任务或活动任务失败

执行完任务后,活动工作线程应报告活动任务完成或失败。

完成活动任务

若要完成活动任务,请给活动工作线程编程,以使其在成功完成活动任务时调用 RespondActivityTaskCompleted 操作,从而指定任务令牌。

在此示例中,活动工作线程指示任务已成功完成。

https://swf.us-east-1.amazonaws.com RespondActivityTaskCompleted { "taskToken": "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "results": "40" }

活动完成后,Amazon SWF 会排定与该活动关联的工作流程执行的新决策任务。

给活动工作线程编程,以在其即将完成任务后轮询另一个活动任务。此操作会创建一个循环,在该循环中,活动工作线程会继续轮询并完成任务。

如果活动在开始关闭超时期间,或计划关闭超时,则 Amazon SWF 会超时活动任务并安排决策任务。这会使决策程序采取适当操作,如重新排定任务。

例如,如果 Amazon EC2 实例正在执行活动任务且该实例在任务完成前失败,则决策者会将一个超时事件接收到工作流程执行历史中。如果该活动任务正在使用检测信号,则决策者会在 Amazon EC2 实例失败后任务未传输下一个检测信号时接收该事件。否则,决策程序会在活动任务触及整个超时值中的一个前完成失败时最终接收事件。然后,由决策程序决定重新分配任务或采取某些其它操作。

活动任务失败

如果活动工作人员出于某种原因无法执行活动任务,但仍能与 Amazon SWF 通信,则可以对其进行编程以使该任务失败。

若要对活动工作线程编程以使某个活动任务失败,请对活动工作线程编程以调用指定任务令牌的 RespondActivityTaskFailed 操作。

https://swf.us-east-1.amazonaws.com RespondActivityTaskFailed { "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "reason" : "CC-Invalid", "details" : "Credit Card Number Checksum Failed" }

作为开发人员,您要规定存储在原因和详情字段中的值。这些值是自由格式的字符串;您可以使用适用于您的应用程序的任何错误代码约定。亚马逊 SWF 不处理这些值。但是,Amazon SWF 可在控制台中显示这些值。

活动任务失败时,Amazon SWF 会排定与该活动任务关联的工作流程执行的决策任务,以通知决策者任务失败。给您的决策程序编程以处理失败的活动,如通过重新排定活动或使工作流执行失败,这取决于失败的性质。

启动活动工作线程

要启动活动工作线程,将您的逻辑打包成可执行,这样您就可以将其用于您的活动工作线程平台上。例如,您可以将您的活动代码打包成 Java 可执行,这样您就可以将其用于 Linux 和 Windows 服务器上。

启动后,您的工作线程即会开始轮询任务。在决策程序排定活动任务之前,虽然这些轮询超时未轮询到任务,但您的工作线程只会继续轮询。

由于轮询是出站请求,活动工作人员可以在任何可以访问 Amazon SWF 终端节点的网络上运行。

您想要启动多少活动工作线程就可以启动多少。当决策者排定活动任务时,Amazon SWF 会将活动任务自动分配给轮询活动工作人员。