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

标签 java spring amazon-swf

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

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

我的子工作流程调用多个下游服务(每个服务位于不同的 Activity 中),例如。

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

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

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

子工作流程:

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

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

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

感谢您的建议!

最佳答案

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

另一种方法是在工作人员级别实现速率限制。 ActivityWorker已经支持通过setMaximumPollRatePerSecond进行速率限制。如果单个工作人员可以维持调用率,则选择该工作人员作为并通过 suspendPolling 暂停所有其他工作人员解决了问题。如果需要多个工作人员,则多个主设备同时处于 Activity 状态,每个主设备的速率仅限于总体速率的一部分。

可以使用单独的 SWF 工作流程来选举工作人员作为主工作人员。主选举工作流程的基本思想是有一个GetLock Activity 。执行它的主机被认为是主机。此 Activity 应该具有较小的(假设为 20 秒)心跳超时和较大的整体超时。因此拥有它的主机必须至少每 20 秒进行一次心跳才能保持锁定。如果由于某种原因无法检测到工作流,则会失败并重新安排 Activity 以供其他主机抓取。

关于java - 使用 Amazon SWF 限制下游服务的 TPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30519136/

相关文章:

java - IncompleteClassChangeError : Class hbase. client.ConnectionManager$HConnectionImplementation 未实现接口(interface) hbase.client.Connection

java - 使用 sax、stax 或 DOM 将 XML 转换为 java 中的数据结构

java - 按前缀从属性文件读取属性的最有效解决方案是什么?

java - 我如何从过滤器中的servlet上下文获取bean

java - 读取而不从 JMS 队列中删除消息

java - 如何在 bean xml 中定义 dataSource 配置的 init 和 destroy 属性?

java - 轮询时 AWS SWF 决策者 'java.net.SocketTimeoutException: Read timed out'

microservices - 如何在 Netflix Conductor 中向 Task 注册微服务(或其方法)?

java - 在单元测试时访问私有(private) ArrayList (Java/JUnit)