【问题标题】:Using Timers/Signals to allow human intervention in AWS SWF Workflow使用计时器/信号允许人工干预 AWS SWF 工作流
【发布时间】:2013-04-06 21:08:38
【问题描述】:

这是场景。用户上传一个 Excel 文件,这将启动一个验证文件的工作流程,将其转换为几个不同的文件,然后根据转换对数据库执行更新。上传后,需要团队成员审核结果才能继续流程。

我正在使用 Ruby,并且发现信号和计时器是在 SWF 中实现此目的的方法。但是,缺少或不存在 Ruby 示例,我需要一些帮助来了解如何使用 Ruby。

到目前为止,Ny 的理解是安排了一个 Timer 活动,该活动基本上暂停流程,直到计时器到期(此时我可以取消工作流或向员工发送电子邮件并设置另一个计时器)或向工作流发送信号开始下一步。 Decider 将处理信号,然后启动相应的活动。

对其他来源的任何想法或方向将不胜感激。

谢谢, 托马斯

【问题讨论】:

    标签: amazon-web-services workflow


    【解决方案1】:

    鉴于您并没有真正提出具体问题,因此提供“答案”有点困难。我同意你的观点,即使用定时器和信号是你想要的。

    您没有指定团队如何收到有关审核的通知。我假设您通过电子邮件通知他们并将他们定向到可以查看更改的某个网站,然后单击链接以批准或不批准。单击 Approve 链接将向 Web 服务器发送一个请求,该请求将“发出”SWF 信号,表明审查已被批准。单击“不批准”的链接将“发出”SWF 信号,表明审核未获批准。你提到如果没有人对审查采取行动,你想重新通知团队(或者可能升级到经理)。假设此重新通知发生在 48 小时后。重新通知后,您在假设不批准之前再授予他们 72 小时。

    在我看来,您的工作流程如下所示:

    1. 用户上传文件并启动工作流
    2. Decider 任务计划“TransformActivity”
    3. TransformActivity 运行,将数据转换成不同的文件,并成功完成
    4. Decider 任务计划“UpdateDatabaseActivity”
    5. UpdateDatabaseActivity 运行、更新数据库并成功完成
    6. Decider 任务计划“EmailTeamActivity”
    7. EmailTeamActivity 运行,向团队发送电子邮件,并成功完成
    8. Decider Task 将 Timer 安排为 48 小时。

    如果在 48 小时内收到批准或不批准的信号:

    1. Decider 任务计划“RecordFinalDecisionActivity”
    2. RecordFinalDecisionActivity 将运行,将批准(或不批准)记录到数据库中,并成功完成。
    3. Decider Task 将关闭工作流,因为它已完成。

    如果没有收到信号并且计时器触发(48 小时后):

    1. Decider 任务计划“EmailTeamAndManagerActivity”
    2. EmailTeamAndManagerActivity 运行,向团队和经理发送电子邮件,并成功完成。
    3. Decider Task 将另一个计时器安排为 72 小时。

    如果在给定的额外 72 小时内收到指示批准或不批准的信号:

    1. 重复与“如果在 48 小时内收到指示批准或不批准的信号”部分相同的逻辑。

    如果没有收到信号并且计时器触发(在额外的 72 小时之后):

    1. 此时,工作流可以假定它是“不批准”,安排“RecordFinalDecisionActivity”并在该活动完成后关闭工作流。

    您不想进行“审核”活动的原因是因为该任务已安排好,然后一些活动工作人员需要回复成功。那将如何运作?当有人单击批准或不批准链接时,对网络服务器的请求将不得不从任务列表中拉下活动。但是,如果任务列表有多个活动,SWF 只会给出其中任何一个。它可能找不到正确的。现在,您可以争辩说您可以在不同的任务列表中安排不同的审核,但这很麻烦而且乏味。

    信号是用来指示“外部”事件的,这非常重要。 SWF documentation on Signals 在谈论信号方面做得很好。这是SWF documentation on how to use Timers and Signals。至于如何使用 SWF 和 Ruby,我真的帮不上忙。我只通过使用 AWS Flow Framework 将 SWF 与 Java 结合使用。

    【讨论】:

    • 感谢您的精彩解释。我认为您设置的那些计时器是活动任务超时的副本。为了向 exec 发出信号,您需要 domain + workflowId,为了响应活动,您只需要 taskToken。太糟糕了,当前的 Ruby SDK 不允许您仅使用 taskToken (bit.ly/14QOIC8) 来实例化活动任务。 (对不起,我被宠坏了,我直接通过 API 工作)所以是的,你必须“下载”任务。我还是更喜欢活动。查询 exec 清楚地表明它有一个 [review] 活动任务。
    • 是的……很好的解释。我真的在我建议的流程上寻找 cmets,看看是否有其他实现方式。你已经确认这是要走的路。我一直在阅读 sdk 源代码,我已经弄清楚了如何让流程的基础知识正常工作,并将在此处发布。再次感谢。
    【解决方案2】:
    1. 用户上传 Excel 文件,执行“StartWorkflowExecution”,将决策任务排入队列
    2. 决策工作者通知流程是新的/“第一阶段”,它安排“转换文件”活动任务
    3. 活动工作者拿起任务,并执行“转换文件”活动,完成后执行“RespondActivityTaskCompleted”,结果“转换完成”,将决策任务排入队列
    4. 决策工作者拿起决策任务,注意到转换已完成并安排新的活动任务
    5. 活动工作者拿起活动任务,注意到它是给团队成员的(根据决策工作者在安排活动任务时给出的指示),团队成员得到通知,以某种方式执行他的操作,然后以某种方式通知活动工作者将回复“RespondActivityTaskCompleted”

    我认为不需要计时器或信号,它只是简单的流程。如果您想要重复事件、超时和/或中断流程,这两个概念很有用。

    请注意,您可以通过使用任务列表来区分活动工作者(例如,用于自动化工作的活动工作者与用于人类参与者的活动工作者,等等)。

    【讨论】:

    • 你在#5 中掩盖了活动工作者。它将如何分配、通知用户、等待响应(可能需要几天时间)以及回复 SWF?使用定时器和信号是正确的方法。
    • 评论是一项活动。
    猜你喜欢
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 2018-09-17
    • 2017-10-09
    相关资源
    最近更新 更多