目前,我们有一个 Amazon Simple Workflow 应用程序,其中有一些任务可以在流程开始时并行发生,然后是一条通过关键区域的路径,我们只能允许一个流程继续进行。
我们将关键区域建模为子工作流,并且一次只允许一个进程在子工作流中运行(尽管我们的代码中存在竞争条件,但尚未引起我们的问题)。这是做的工作,但它有一些问题。
我们有一个方法可以不断检查子工作流是否正在运行,如果没有继续运行(上面提到的竞争条件 - 正在运行检查和开始运行不是原子操作),否则抛出异常并重试,此方法有一个指数退避,问题是: 1. 随着多个工作流进入,哪个工作流将首先进行是不确定的,如果这是一个先进先出队列会更好。2. 我们最终可能会等待很长时间才能开始下一个工作流程,所以会浪费时间,如果工作流程在最后一个工作完成后立即进行就好了。
我们可以通过减少重试间隔来解决第 2 点,但我们仍然会遇到非 FIFO 问题。
我可以想象在一台带有队列和锁的机器上很容易地建模,但是我们在 SWF 中有哪些选择?