在Amazon SWF中,我可以滥用决策任务来实际执行工作吗?

4
我需要使用Amazon SWF来分发一些工作,确保工作异步完成、可靠存储并自动重启。然而,我需要的工作流逻辑非常简单:只需执行一个任务。
我现在按照应该完成的方式实现了它:
1. 请求工作流执行。 2. 决策者发现请求并安排活动。 3. 工作者发现活动请求,执行结果并返回结果。 4. 决策者注意到结果并将其复制到工作流完成中。
在我看来,我只需要让决策者完成工作流执行即可。这将省去很多代码。(活动可能也会失败、超时等,这些都是我目前需要考虑的问题。)
那么回到我的问题:我可以让一个决策者执行工作并立即完成“工作流”吗?
2个回答

2
是的。实际上,我认为您提出了一个有趣的用例:使用最小化的工作流作为分布式系统中一次性行动的集中锁定机制 - 比如从众多主机中执行的cron任务(主机必须首先进行选举,获得锁的主机才能执行操作)。使用Amazon SWF和最少量的代码也可以实现相同的效果:
以下是一个小的Python示例,使用`boto.swf`(请参考 此帖子 设置域):
编写决策者的代码:
#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

如果您的工作流程可能会发展其业务逻辑或增加活动数量,最好坚持使用标准方式,即由决策者执行业务逻辑,工作者解决任务。


1
虽然是的,你可以这样做(正如其他答案所指出的那样),但在这样做之前有些事情需要考虑:
1. 为什么要使用SWF来执行此任务?如果您可以更直接地调用代码获得相同的效益,为什么要将其设置为工作流并支付“StartWorkflow”执行的费用?如果您需要跟踪执行提交和完成,您可以只使用SQS队列并以更便宜的价格获得相同的结果。 2. 您的工作流现在可能非常简单,但随着时间的推移,它们往往会变得更加复杂。从一开始就正确设计可以节省长期的时间。您是否希望未来的开发人员在处理您的代码时认为他们应该只需向工作流添加更多逻辑?他们会知道查找如何使用活动,还是只是按照您已经开始的现有模式进行操作吗?(提示-他们很可能会复制您的模式-开发人员很懒:))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接