【问题标题】:Limiting TPS on downstream service with Amazon SWF使用 Amazon SWF 限制下游服务的 TPS
【发布时间】:2015-08-11 16:53:21
【问题描述】:

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

我有一个父工作流启动多个并行运行的子工作流。

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

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

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

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

子工作流程:

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

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

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

感谢您的任何建议!

【问题讨论】:

    标签: java spring amazon-swf


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 2015-01-30
      • 2020-02-19
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多