在 SWF 中创建 FIFO 队列以控制对关键代码段的访问



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

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

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

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

我可以想象在具有队列和锁的单台机器上很容易地对此进行建模,但是我们在 SWF 中的选择是什么?

您可以拥有始终运行的"关键部分"工作流。然后向它发出信号以"排队"执行请求。收到信号后,"关键部分"工作流要么启动活动(如果它未运行(,要么在决策程序中对请求进行排队。活动执行完成后,"响应"信号将发送回请求者工作流。由于"关键部分"工作流始终在运行,因此它会定期重新启动自身作为新工作流(将未完成请求列表作为参数传递(,与所有 cron 工作流相同的方式。

最新更新