4

我需要 Amazon SWF 来分配一些工作,确保它是异步完成的,确保它以可靠的方式存储并且它会自动重新启动。但是,我需要的工作流逻辑非常简单:只需执行一个任务。

我现在按照应该完成的方式实现了它:

  1. 请求工作流执行
  2. 决策者发现了它并安排了一项活动
  3. Workers 发现活动请求,执行结果并返回结果
  4. 决策者注意到结果并将其复制到工作流完成中

在我看来,我可以让决策者完成工作——就像它一样——并立即完成工作流执行。那会处理很多代码。(活动也可能失败、超时等。我目前需要处理的所有事情。)

回到我的问题:我可以有一个决策者自己执行工作并立即完成“工作流程”吗?

4

2 回答 2

2

是的。实际上,我认为您想出了一个有趣的用例:使用最小的工作流作为分布式系统中一次性操作的集中锁定机制 - 例如从多个主机中的单个主机执行的 cron 作业(主机有首先进行选举,无论谁赢得锁,都可以执行一个动作)。使用 Amazon SWF 和最少的代码也可以实现相同的目标:

一个小的 Python 示例,使用boto.swf(使用 1. from this post来设置域):

对决策者进行编码:

#MyDecider.py
import boto.swf.layer2 as swf

class OneShotDecider(swf.Decider):

    domain = 'stackoverflow'
    task_list = 'default_tasks'
    version = '1.0'

    def run(self):
        history = self.poll()
        if 'events' in history:
            decisions = swf.Layer1Decisions()
            print 'got the decision task, doing the work'
            decisions.complete_workflow_execution()
            self.complete(decisions=decisions)
            return False
        return True

启动决策者:

$ ipython -i decider.py
In [1]: while OneShotDecider().run(): print 'polling SWF for decision tasks'

最后,开始工作流程:

$ ipython
In [1]: wf_type = swf.WorkflowType(domain='stackoverflow', name='MyWorkflow', version='1.0', task_list='default_tasks')

In [2]: wf_type.start()
Out[2]: <WorkflowExecution 'MyWorkflow-1.0' at 0x32e2a10>

回到决策者窗口,您会看到如下内容:

polling SWF for decision tasks
polling SWF for decision tasks
got the decision task, doing the work

如果您的工作流可能会发展其业务逻辑或活动数量增加,那么最好坚持让决策者执行业务逻辑并让工作人员解决任务的标准方式。

于 2013-07-24T08:13:37.160 回答
1

虽然是的,你可以这样做(正如另一个答案所指出的那样),在这样做之前有一些事情需要考虑:

  1. 为什么要使用 SWF 来执行此任务?如果您可以通过更直接地调用代码来获得相同的好处,为什么还要将其设置为工作流并为“StartWorkflow”执行付费?如果您需要跟踪执行提交和完成,您可以为此使用 SQS 队列并以更便宜的方式获得相同的结果。
  2. 您的工作流程现在可能非常简单,但随着时间的推移,它们通常可以而且确实会变得更加复杂。从一开始就设计它从长远来看可以节省时间。您是否希望未来的开发人员在处理您的代码时认为他们应该为工作流程添加更多逻辑?他们会知道查找如何使用活动,还是只遵循您开始使用的现有模式?(提示 - 他们可能会复制你的模式 - 开发人员很懒 :))
于 2014-10-14T23:28:24.230 回答