首页 文章

使用Amazon SWF限制下游服务的TPS

提问于
浏览
1

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

我有一个父工作流程,可以启动几个并行运行的子工作流程 .

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

  • 调用下游服务1,如果成功,则退出失败

  • 调用下游服务2,如果成功,则退出失败

我希望能够分别管理下游服务的TPS .

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

子工作流程:

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

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

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

谢谢你的任何建议!

1 回答

  • 2

    我不认为SWF本身支持活动执行的速率限制或者是任务列表的精确最大任务传递速率 .

    另一种方法是在 Worker 级别实施速率限制 . ActivityWorker已通过setMaximumPollRatePerSecond支持速率限制 . 如果单个工作人员可以维持呼叫率,则选择此工作人员作为主人并通过suspendPolling暂停所有其他工作人员来解决问题 . 如果需要多个工作人员,则多个主人在同一时间处于活动状态,每个主人的费率限制为总费率的一部分 .

    单独的SWF工作流程可用于选择worker [s]作为master . 主选举工作流的基本思想是拥有GetLock活动 . 执行它的主机被认为是主机 . 此活动应该具有较小(假设为20秒)的心跳超时和较大的总体超时 . 所以拥有它的主机必须至少每20秒钟心跳一次以保持锁定 . 如果由于某种原因导致心跳失败,则会导致失败并重新安排其他主机抓取的活动 .

相关问题