我正在使用 Amazon SWF 编写工作流程,并且想知道如何控制下游服务的 TPS。
我有一个父工作流程,它启动多个并行运行的子工作流程。
我的子工作流程调用多个下游服务(每个服务位于不同的 Activity 中),例如。
- 调用下游服务1,成功则继续,失败则退出
- 调用下游服务2,成功则继续,失败则退出
- 等等
并且我希望能够单独管理下游服务的 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/