场景:必须处理一堆小尺寸(平均每个 50 字节)的记录(比如 10k,也许更多)。处理必须并行或以任何其他方式进行以提高性能(请记住,我们有很多记录要处理)。此外,处理本身是一项非常简单的任务(这是使用 AWS Lambda 的原因之一)。尽管它很简单,但某些处理可能在其他处理之前/之后结束,因此这是这些记录彼此独立并且处理顺序无关紧要的另一个原因。
到目前为止,Step Functions 看起来像是要走的路。
使用 Step Functions,我们可以得到下图:
我可以将 RecordsRetrieval 定义为一项任务。之后,这些记录将由任务 ProcessRecords-Task-1、ProcessRecords-Task-2 和 ProcessRecords-Task-3 并行处理。从表面上看,一切都很好,花花公子,对吧?错误的!
第一个问题:动态缩放如果我想动态缩放这些任务(比如说... 10、100、5k 或 10k),考虑到要处理的记录数量,我将不得不动态构建 json 以实现这一点(不是一个非常优雅的解决方案,但它可能会起作用)。我非常有信心任务的数量是有限的,所以我不能依赖它。如果扩展繁重的工作由基础设施而不是我来处理,那就更好了。
无论哪种方式,对于一组定义明确的并行任务,例如:GetAddress、GetPhoneNumber、GetWhatever... 都很棒!奇迹般有效!
第二个问题:Payload Dispatch 在 RecordsRetrieval 任务之后,我需要单独处理这些记录中的每一个。使用 Step Functions,我没有看到任何方法可以做到这一点。一旦 RecordsRetrieval 任务传递了它的有效负载(在这种情况下是那些记录),所有并行任务将处理相同的有效负载。
同样,就像我在第一个问题中所说的那样,对于一组定义明确的并行任务,这将是一个完美的选择。
结论 我认为,AWS Step Functions 可能不是我的场景的解决方案。这是我对此知识的总结,所以如果我确实遗漏了什么,请随时发表评论。
出于多种原因(可扩展性、无服务器、简单性等),我正在研究微服务方法。
我知道可以检索这些记录并一个接一个地发送到另一个 lambda,但同样,这不是一个非常优雅的解决方案。
我也知道这是一个批处理作业,AWS 有批处理服务。我想要做的是保持微服务方法而不依赖于 AWS Batch/EC2。
你对此有什么想法?随意发表评论。任何建议将不胜感激。