1

我正在使用 Amazon SWF 编写工作流程,并且想知道如何控制下游服务的 TPS。

我有一个父工作流,它启动了几个并行运行的子工作流。

我的子工作流程调用了几个下游服务(每个都在不同的活动中),例如。

  1. 调用下游服务1,成功则继续,失败则退出
  2. 调用下游服务2,成功则继续,失败则退出
  3. ETC

并且我希望能够单独管理下游服务上的 TPS。

如何限制下游服务的 TPS?例如,理想情况下,我希望能够说我希望下游服务 1 的最大 TPS 为 100。在非并发上下文中,我可以使用 Guava RateLimiter 之类的东西,但是这将跨多个主机运行。我可以指定一次只运行 100 个给定活动的实例吗?我在流框架中找不到注释(我正在使用流框架和 Spring)。如果需要,我很乐意将子工作流分成单独的工作流,并让父工作流一个接一个地调用每个子工作流,例如。

子工作流程:

1. take entity id as input
2. call dependent service 1 workflow
3. return

然后,如果上述成功完成,则父工作流将调用调用依赖服务 2 的下一个子工作流,或者如果失败,则父工作流将退出。

是否可以对给定依赖服务工作流的实例数量或给定活动设置并发限制?这是任务列表的良好/潜在用法吗?我可以通过工作主机的数量来控制 TPS 吗?

感谢您的任何建议!

4

1 回答 1

2

我不认为 SWF 本身支持活动执行的速率限制,或者准确地说是任务列表的最大任务交付率。

另一种方法是在工作人员级别实施速率限制。ActivityWorker已经通过setMaximumPollRatePerSecond支持速率限制。如果单个worker可以维持调用率,那么选择这个worker作为master并通过suspendPolling暂停所有其他worker可以解决问题。如果需要一个以上的工作人员,那么多个主机同时处于活动状态,每个主机的速率限制为总速率的一部分。

可以使用单独的 SWF 工作流来选择 worker[s] 作为 master。主选举工作流的基本思想是有一个GetLock活动。执行它的主机被认为是主机。这个活动应该有小的(比如说 20 秒)心跳超时和大的整体超时。所以拥有它的主机必须至少每 20 秒心跳一次以保持锁定。如果由于某种原因无法检测到工作流,则会失败并重新安排活动以供其他主机抓取。

于 2015-05-29T03:27:24.620 回答