首页 文章

在Amazon SWF中,我可以滥用Decision任务来实际执行工作

提问于
浏览
4

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

我现在以它应该完成的方式实现它:

  • 请求工作流程执行

  • Decider发现了它并安排了一项活动

  • Worker 发现活动请求,执行结果并返回结果

  • Decider注意到结果并在工作流程完成时将其复制

在我看来,我可以让决策者完成工作 - 就像它一样 - 并立即完成工作流程执行 . 这将照顾 a lot 代码 . (活动也可能失败,超时等等 . 我目前需要满足的所有事情 . )

所以回到我的问题:我可以有一个执行工作的决策器并立即完成'workflow'吗?

2 回答

  • 2

    是 . 实际上,我认为你提出了一个有趣的用例:使用最小的工作流作为集中式锁定机制,用于分布式系统中的一次性操作 - 例如从许多机群中的单个主机执行的cron作业(主机具有首先进行选举,以锁获得的任何胜利来执行一项行动) . 使用Amazon SWF和最少量的代码可以实现同样的目标:

    一个小的Python示例,使用 boto.swf (使用1.来自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
    

    如果您的工作流程可能会改变其业务逻辑或增加活动数量,那么最好坚持使用Deciders执行业务逻辑和Worker解决任务的标准方法 .

  • 1

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

    • 为什么使用SWF执行此任务?如果您可以通过更直接地调用代码获得相同的好处,为什么还要把它设置为工作流并支付"StartWorkflow"执行?如果您需要跟踪执行提交和完成,您可以为此使用SQS队列,并以更便宜的方式获得相同的结果 .

    • 您的工作流程现在可能非常简单,但随着时间的推移,它们通常会变得更加复杂 . 从一开始就设计它可以节省长时间的时间 . 您是否希望未来的开发人员在编写代码时认为他们应该只为工作流添加更多逻辑?他们是否知道如何使用活动,或者只是按照现有的模式,你可能会复制你的模式 - 开发人员很懒:))

相关问题