0

目前,我们有一个 Amazon Simple Workflow 应用程序,其中有一些任务可以在流程开始时并行发生,然后是一条通过关键区域的路径,我们只能允许一个流程继续进行。

我们将关键区域建模为子工作流,并且一次只允许一个进程在子工作流中运行(尽管我们的代码中存在竞争条件,但尚未引起我们的问题)。这是做的工作,但它有一些问题。

我们有一个方法可以不断检查子工作流是否正在运行,如果没有继续运行(上面提到的竞争条件 - 正在运行检查和开始运行不是原子操作),否则抛出异常并重试,此方法有一个指数退避,问题是: 1. 随着多个工作流进入,哪个工作流将首先进行是不确定的,如果这是一个先进先出队列会更好。2. 我们最终可能会等待很长时间才能开始下一个工作流程,所以会浪费时间,如果工作流程在最后一个工作完成后立即进行就好了。

我们可以通过减少重试间隔来解决第 2 点,但我们仍然会遇到非 FIFO 问题。

我可以想象在一台带有队列和锁的机器上很容易地建模,但是我们在 SWF 中有哪些选择?

4

1 回答 1

1

您可以拥有始终运行的“关键部分”工作流程。然后向它发出信号以“排队”执行请求。收到信号后,“关键部分”工作流要么在未运行时启动活动,要么在决策程序中将请求排队。当活动执行完成时,“响应”信号被发送回请求者工作流。由于“关键部分”工作流始终在运行,它会定期将自身重新启动为新的(将未完成请求列表作为参数传递),就像所有 cron 工作流所做的一样。

于 2014-12-11T23:30:55.227 回答