amazon-web-services - 具有批处理限制的 AWS Step Functions

标签 amazon-web-services aws-lambda aws-step-functions

场景 :必须处理一堆小尺寸(平均每个 50 字节)的记录(如 10k,也许更多)。处理必须并行完成或以任何其他方式完成以提高性能(请记住,我们有很多记录要处理)。此外,处理本身是一项非常简单的任务(这是使用 AWS Lambda 的原因之一)。虽然它很简单,但某些处理可能会在其他处理之前/之后结束,所以这就是为什么这些记录被删除的另一个原因
彼此独立,处理顺序无关紧要。

到目前为止,Step Functions 看起来像是要走的路。

使用 Step Functions,我们可以得到下图:

enter image description here

我可以将 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;
}
  • 如上所述,定义 lambda 哪个任务将只获取记录数。此 lambda 可以在 s3 事件或计划事件上触发,也可以按照您的方式触发。在这里,我们可以定义每个 lambda 调用/批处理作业处理的记录数。此 lambda 将调用/提交批处理作业的次数 =(总记录数)/(每个作业/lambda 调用的记录数)。
  • 如果您更喜欢 lambda,那么定义 lambda 以将两个参数 start 和 limit 作为输入。这些参数将决定从哪里开始读取要处理的文件以及从哪里停止。这个 lambda 也知道从哪里读取记录。
  • 如果您更喜欢批处理,则使用与上述相同的逻辑定义作业定义。

  • 您可以使用 AWS lambda,因为您的记录处理不是计算/内存密集型的。但如果是,那么我会建议使用 AWS 批处理进行此处理。

    关于amazon-web-services - 具有批处理限制的 AWS Step Functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48724666/

    相关文章:

    java - 无法使用 Lambda 部署示例 Alexa 技能

    c# - 适用于 .NET 的 AWS 开发工具包 - IAmazonS3 不包含 'PutObject' 的定义

    java - 如何在 AWS Lambda 函数中获取任务 token

    amazon-web-services - 从 AWS Glue 作业中引用 Hive View

    amazon-web-services - 如何使用 Route 53 在 AWS 中使用单个弹性 IP 地址为多个子域提供服务?

    java - AWS Java putObject InvalidRedirectLocation

    node.js - Websocket 和 Ec2 实例

    javascript - 从 Docker 镜像向 Lambda 公开处理程序函数

    amazon-web-services - 如何在 python 中从 CDK v2 定义 AWS Step Function 的参数?

    amazon-web-services - AWS CloudFormation ApiGatewayV2 需要目标属性