【问题标题】:Will Child workflow continue to run after parent is finished? (ChildPolicy.ABANDON)父级完成后,子级工作流程会继续运行吗? (ChildPolicy.ABANDON)
【发布时间】:2015-10-01 11:33:11
【问题描述】:

我想从一个工作流程(父)触发子工作流程。基本上这会在决策者的循环中发生

@Workflow
@WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 240,
              defaultTaskStartToCloseTimeoutSeconds = 60)
public interface W1{
    @Execute(version = "1.0")
    void fn();
}

public class W1Impl implements W1{
    ChildClientFactory factory = new ChildClientFactoryImpl();

    @Override
    public void fn() {
       int i;
      /*
          I'll call activity1 that returns me a list(size = n)
          I trigger n child worflows(Each takes the content in the list and operates)
      */
       for(i = 0; i < n; i++) {
          ChildClient childWorkflowClient = factory.getClient();
          childWorkflowClient.someMethod(params);//TRIGGERING CHILD WORKFLOW
      }
    }
}

父工作流无需等待子工作流完成。即)子工作流将根据对它们的输入进行一些处理,并将结果放入持久存储中。 所以我不会从子工作流返回promise

注意:子工作流的决策者返回类型是void

WorkflowRegistrationOptions 上的ChildPolicy 选项具有ABANDON 选项

来自文档:

ABANDON:Amazon SWF 将不采取任何措施;子执行将继续运行。

问题:

  1. 当我没有从子工作流返回任何 Promise 时,父工作流会在触发所有子工作流后结束吗?

即)在触发n 子工作流后,父级必须完成执行。孩子会继续跑。 (因为我指定了ChildPolicy.ABANDON)。这是正确的吗?

  1. 父级的defaultExecutionStartToClosetimeoutSeconds 不需要考虑(包括)子工作流的超时时间,对吧?

3. 子工作流的触发频率是否有任何限制? (因为我从循环中触发工作流)

还有什么需要我注意的吗?

谢谢..

【问题讨论】:

    标签: java amazon-web-services workflow amazon-swf


    【解决方案1】:

    我认为它不会完成。当包括活动和子工作流在内的所有任务都完成或失败时,父工作流退出。内部工作流在 TryCatchFinally 内部调用,并且仅在执行 doFinally 时完成。它不依赖于返回任何结果的子工作流及其子策略。即使它返回 void 生成的工作流客户端仍然返回 Promise 并且忽略此承诺不会改变行为。添加 workflowClient.detach 方法以断开父级与子级的连接应该非常简单。它将完成ExternalTask that controls the child workflow completion

    恕我直言,我不会为分离客户端而烦恼,因为在这种情况下,它们的任何错误都会被忽略。保持它们连接可确保如果孩子因任何原因失败,父母会得到例外。

    至于起始率,我不会很担心。更重要的限制是单亲可以拥有的孩子数量。由于需要在每个决定有太多孩子时返回整个工作流程历史记录并不是一个好主意。我不推荐超过 100 个。如果您需要更多,请创建工作流树。有 100 个孩子的父母,每个人创建自己的 100 个孩子会得到 10k 个孩子。

    使用生成的外部客户端从一个活动开始一个独立的工作流是一种可能的解决方法。只需确保正确处理可能的故障条件,例如工作流启动和由于通信错误导致的活动失败。使用ActivityExecutionContext 访问对 SWF 端点的引用和其他相关信息。

    【讨论】:

    • 我现在正在考虑从父项中的活动启动子工作流。这可能吗?我要让所有子工作流程并行运行。 (即 我不会将 Promise 作为参数传递,这会使它们成为连续的)。在这种情况下,如果父级的超时时间略大于一个子工作流的超时时间就足够了吗?
    • 用“从活动开始”答案更新评论
    • 如果我从其中一个活动启动子工作流,那么该活动不会等待子工作流完成吗?
    • 使用外部客户端启动工作流(应该从活动中使用)是同步操作,一旦工作流执行开始就会返回。因此活动不会等待工作流完成。它也没有得到任何关于工作流执行的反馈。
    • 你的意思是异步
    【解决方案2】:

    1) 不(更新)。见下面马克西姆的回答 2)如果您要放弃它们,子工作流的超时很重要。您唯一应该担心的事情(就超时而言)是父工作流将在有机会启动所有子工作流之前超时。
    3)如果您在短时间内拨打大量电话(我已经看到这种情况发生),SWF 可能会限制您,但文档不清楚大型意味着什么以及时间段是多少。见:http://docs.aws.amazon.com/amazonswf/latest/developerguide/swf-dg-limits.html

    【讨论】:

    • 感谢您的回答。在文档中我找不到关于可以触发子工作流的rate 的信息?它只说applications may be throttled if they make a large number of API calls in a very short period of time.
    • 我上面说的是它没有记录。
    • 那么我怎样才能确保它不会节流并正常运行?
    • 一种方法是捕获油门异常。另一种方法(我会做的)是将启动子工作流实际包装在一个活动中并配置对这些活动的重试,以便您确定它们通过了。 SWF 将为您进行重试(还要确保在关闭父工作流之前等待所有活动完成)
    • 那么是否可以从活动中触发工作流?我以为我只能从决策者那里做到这一点
    【解决方案3】:

    您似乎对启动外部工作流程而不是子工作流程感兴趣。最佳实践是从父工作流中的活动启动工作流。这样就不会创建层次结构。 此外,当从决策工作者启动工作流和活动时,速率是受控的(据我所知,它是每秒 10 个活动和 4 个子工作流,可以通过与 swf 团队交谈来增加)。允许出现一些峰值,但如果速率没有下降,那么您将开始得到 rateexceededexception(不是吞吐量或油门)。 但是,如果您从一个相当于刚刚开始新工作流的活动启动它,则不会出现此类问题。

    【讨论】:

    • 这是一个子工作流。来自文档,When a workflow execution is started from the context of another workflow execution, it is called a child workflow execution
    • 但是如果您想启动一个新的工作流并且不希望在现有和新的工作流执行之间创建任何关系,那么您需要启动一个外部工作流。这需要不是由决策工作者完成,而是由活动工作者完成。
    • 那么在所有触发的工作流完成之前,当前的工作流会存在吗?
    • 没有。当前工作流程不会等待任何其他工作流程完成。它只会启动它们并结束。启动的所有新外部工作流都将运行并在稍后结束。
    猜你喜欢
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2018-06-04
    • 1970-01-01
    相关资源
    最近更新 更多