如何限制同时运行的工作流数量?



标题就是问题所在。是否有某种方法可以限制在任何给定时间运行的并发工作流的数量?

一些背景:一旦消息被发送到pubsub主题,我使用eventarc来调度工作流。该工作流将用于启动一些长时间运行的操作(LRO),但由于我不打算详细说明的原因,我不希望在给定时间运行该工作流的实例超过3个。

有办法做到这一点吗?-主要从某种类型的配置,而不是使用另一个计算资源。

总结您的需求:

  1. 使用Pub/Sub消息触发工作流执行
  2. 同时执行最多3个工作流
  3. 排队等待Pub/Sub消息
  4. (未指定)您是否需要在交付的订单中处理消息?

没有现成的功能来实现这一点。为了好玩,下面是一个不需要辅助计算的解决方案(因此仍然是完全托管的)。

使此工作的关键可能是为每个消息开始新的执行,但如果需要,则在执行中等待。工作流不提供全局并发构造,因此您需要使用一些外部存储,例如Firestore。这样的算法可以工作:

  1. 创建回调
  2. 将回调推入FIFO队列
  3. 自动增加计数器(返回新值)
  4. 如果返回值为<= 3,弹出最后一个回调并调用它
  5. 等待回调
  6. ——主工作流——
  7. 自动递减计数器
  8. 如果返回值为<3、弹出最后一个回调并调用它

为了让事情更简洁,你可以把上面的步骤放在一个被触发的工作流中,而把主逻辑放在一个单独的工作流中,根据需要调用。

没有配置来限制运行的进程,这些进程专门针对由启用并发执行的工作流执行的会话。现有的进程限制适用于所有会话,而不区分非并发或并发启用的工作流。

同步使用户能够限制工作流中某些工作流或模板的并行执行,而不必限制其他工作流或模板。

用户可以在ConfigMap中创建多个同步配置,这些配置可以从工作流或工作流中的模板中引用。或者,用户可以配置一个互斥锁,以防止使用相同的互斥锁并发执行模板或工作流。

更多信息请参考此链接

目前,我不知道通过工作流配置来控制它的方法。我确实在google的IssueTracker中发现了这个相关问题。

同时,我建议使用Cloud Tasks来队列工作流执行,这使您能够通过配置所需的max_concurrent_dispatches = 3(在速率限制下)来控制并行运行的并发任务的数量。

不幸的是,我不知道如何直接在eventarc事件上创建新的云任务。为此,我将创建一个由相关eventarc/pubsub触发的云函数,该函数将新的云任务添加到预定义队列中。

所以完整的解决方案看起来像:eventarc→PubSub→Cloud-Function→Cloud-Task(最多并行3个)->Cloud-Workflow执行。

相关内容

  • 没有找到相关文章