在 Amazon SWF 中,我可以滥用决策任务来实际执行工作吗
Posted
技术标签:
【中文标题】在 Amazon SWF 中,我可以滥用决策任务来实际执行工作吗【英文标题】:In Amazon SWF, can I abuse a Decision task to actually perform the work 【发布时间】:2013-07-23 01:23:03 【问题描述】:我需要 Amazon SWF 来分配一些工作,确保它是异步完成的,确保它以可靠的方式存储并自动重新启动。但是,我需要的工作流逻辑非常简单:只是执行一个任务。
我现在按照应有的方式实现了它:
-
请求工作流执行
Decider 发现并安排了一项活动
Workers 发现活动请求,执行结果并返回结果
Decider 注意到结果并将其复制到工作流完成中
在我看来,我可以让决策者完成工作 - 就像它一样 - 并立即完成工作流执行。这将处理 很多 代码。 (活动也可能失败、超时等。我目前需要处理的所有事情。)
回到我的问题:我可以有一个 决策者 自己执行工作并立即完成“工作流程”吗?
【问题讨论】:
【参考方案1】:是的。实际上,我认为您想出了一个有趣的用例:使用最小的工作流作为分布式系统中一次性操作的集中锁定机制 - 例如从多个主机中的单个主机执行的 cron 作业(主机有首先进行选举,无论谁赢得锁,都可以执行一个动作)。使用 Amazon SWF 和最少的代码也可以达到同样的效果:
一个小的 Python 示例,使用 boto.swf
(使用 1. from this post 来设置域):
对决策者进行编码:
#MyDecider.py
import boto.swf.layer2 as swf
class OneShotDecider(swf.Decider):
domain = '***'
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='***', 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
如果您的工作流程可能会发展其业务逻辑或增加活动数量,最好坚持让决策者处理业务逻辑和工作人员解决任务的标准方式。
【讨论】:
【参考方案2】:虽然可以,但您可以这样做(正如其他答案所指出的那样),但在这样做之前需要考虑一些事项:
-
为什么要使用 SWF 来执行此任务?如果您可以通过更直接地调用代码来获得相同的好处,为什么还要将其设置为工作流并为“StartWorkflow”执行付费?如果您需要跟踪执行提交和完成,您可以为此使用 SQS 队列并以更便宜的方式获得相同的结果。
您的工作流程现在可能非常简单,但随着时间的推移,它们通常可以而且确实会变得更加复杂。从长远来看,从一开始就设计它可以节省时间。您是否希望未来的开发人员在处理您的代码时认为他们应该为工作流程添加更多逻辑?他们会知道查找如何使用活动,还是只遵循您开始使用的现有模式? (提示 - 他们可能会复制你的模式 - 开发人员很懒惰 :))
【讨论】:
以上是关于在 Amazon SWF 中,我可以滥用决策任务来实际执行工作吗的主要内容,如果未能解决你的问题,请参考以下文章