场景 :必须处理一堆小尺寸(平均每个 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... 都很棒!奇迹般有效!
第二个问题 : 有效载荷调度
在 RecordsRetrieval 任务之后,我需要单独处理这些记录中的每一个。使用 Step Functions,我没有看到任何实现这一点的方法。一旦 RecordsRetrieval 任务传递了它的有效负载
(在这种情况下,这些记录),所有并行任务将处理相同的有效负载。
同样,就像我在第一个问题中所说的那样,对于一组明确定义的并行任务,这将是一个完美的选择。
结论
我认为,AWS Step Functions 可能不是我的场景的解决方案。这是我对它的知识的总结,所以如果我遗漏了什么,请随时发表评论。
出于多种原因(可扩展性、无服务器、简单性等),我正在研究微服务方法。
我知道可以检索这些记录并一个一个地发送给另一个 lambda,但同样,这不是一个非常优雅的解决方案。
我也知道这是一个批处理作业,AWS 有批处理服务。我想要做的是在不依赖 AWS Batch/EC2 的情况下保持微服务方法。
你对此有何看法?随意发表评论。任何建议将不胜感激。
最佳答案
说完您的意见,根据我的说法,以下解决方案可以符合您的标准。您可以将 AWS lambda 或 AWS 批处理用于以下解决方案。
var BATCH_RECORD_SIZE = 100;
var totalRecords = getTotalCountOfRecords();
var noOfBatchInvocation = getTotalCountOfRecords() % BATCH_RECORD_SIZE == 0 ? getTotalCountOfRecords() / BATCH_RECORD_SIZE : getTotalCountOfRecords() /BATCH_RECORD_SIZE + 1;
var start = 0;
for( 1 to noOfBatchInvocation ) {
// invoke lambda / submit job
invokeLambda(start, BATCH_RECORD_SIZE);
// OR
submitJobWith(start, BATCH_RECORD_SIZE);
// increment start
start += BATCH_RECORD_SIZE;
}
您可以使用 AWS lambda,因为您的记录处理不是计算/内存密集型的。但如果是,那么我会建议使用 AWS 批处理进行此处理。
关于amazon-web-services - 具有批处理限制的 AWS Step Functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48724666/