标题就是问题所在。是否有某种方法可以限制在任何给定时间运行的并发工作流的数量?
一些背景:一旦消息被发送到pubsub
主题,我使用eventarc
来调度工作流。该工作流将用于启动一些长时间运行的操作(LRO),但由于我不打算详细说明的原因,我不希望在给定时间运行该工作流的实例超过3个。
有办法做到这一点吗?-主要从某种类型的配置,而不是使用另一个计算资源。
总结您的需求:
- 使用Pub/Sub消息触发工作流执行
- 同时执行最多3个工作流
- 排队等待Pub/Sub消息
- (未指定)您是否需要在交付的订单中处理消息?
没有现成的功能来实现这一点。为了好玩,下面是一个不需要辅助计算的解决方案(因此仍然是完全托管的)。
使此工作的关键可能是为每个消息开始新的执行,但如果需要,则在执行中等待。工作流不提供全局并发构造,因此您需要使用一些外部存储,例如Firestore。这样的算法可以工作:
- 创建回调
- 将回调推入FIFO队列
- 自动增加计数器(返回新值)
- 如果返回值为<= 3,弹出最后一个回调并调用它
- 等待回调
- ——主工作流——
- 自动递减计数器
- 如果返回值为<3、弹出最后一个回调并调用它
为了让事情更简洁,你可以把上面的步骤放在一个被触发的工作流中,而把主逻辑放在一个单独的工作流中,根据需要调用。
没有配置来限制运行的进程,这些进程专门针对由启用并发执行的工作流执行的会话。现有的进程限制适用于所有会话,而不区分非并发或并发启用的工作流。
同步使用户能够限制工作流中某些工作流或模板的并行执行,而不必限制其他工作流或模板。
用户可以在ConfigMap中创建多个同步配置,这些配置可以从工作流或工作流中的模板中引用。或者,用户可以配置一个互斥锁,以防止使用相同的互斥锁并发执行模板或工作流。
更多信息请参考此链接
目前,我不知道通过工作流配置来控制它的方法。我确实在google的IssueTracker中发现了这个相关问题。
同时,我建议使用Cloud Tasks来队列工作流执行,这使您能够通过配置所需的max_concurrent_dispatches = 3(在速率限制下)来控制并行运行的并发任务的数量。
不幸的是,我不知道如何直接在eventarc事件上创建新的云任务。为此,我将创建一个由相关eventarc/pubsub触发的云函数,该函数将新的云任务添加到预定义队列中。
所以完整的解决方案看起来像:eventarc→PubSub→Cloud-Function→Cloud-Task(最多并行3个)->Cloud-Workflow执行。