用于并行处理许多 API 调用的 AWS 解决方案

AWS solution for processing many API calls in parallel

我们正在准备从我们的分析门户网站之一收集数据的解决方案,我们正在使用 Python/API 调用收集数据。 CSV/XLSX 来自我们的分析网络工具的报告使用提到的 API 调用通过 Python 脚本提取大量 JSON 数据。我们需要获取大量客户的数据。我们已经从 AWS t2.medium VM、4 GB RAM、2 个 CPU 执行了我们的 Python 脚本。脚本运行大约 2-3 小时来构建 CSV/XLSX 报告,具体取决于查询(这对我们来说太长了)。所以我们正在考虑其他解决方案,我们需要加快 CSV/XLSX 报告生成速度。我们不确定可以在 AWS 中使用哪些组件。我们正在考虑:一个主要的 Lambda 函数(身份验证、工作分配、触发并发 Lambda 函数)和多个并发 Lambda 函数。每个并发 Lambda 将负责部分工作(10% 的客户端,10% 的 API 调用)。有什么工具可以用来加速 AWS 中提到的解决方案,步骤 Functions/Parallel 流程,Lambda?

我的 Sequence creator(主要 Lambda 函数)代码如下所示:

import boto3
import json
import requests

client = boto3.client('lambda')

def lambda_handler(event, context):
    response1 = client.invoke(FunctionName="worker-00", InvocationType="RequestResponse", Payload=json.dumps(event));
    response2 = client.invoke(FunctionName="worker-01", InvocationType="RequestResponse", Payload=json.dumps(event));
    response3 = client.invoke(FunctionName="worker-02", InvocationType="RequestResponse", Payload=json.dumps(event));
    response4 = client.invoke(FunctionName="worker-03", InvocationType="RequestResponse", Payload=json.dumps(event));

假设输出文件很大并且不是流数据,

对于您的方法,您已经提到的扇出模式会很棒,范围从每个 lambda N 个客户 到每个 lambda 最快 1 个客户,采用 1-N-S3-1 的模式,这将是最快的,但成本也更高,

序列合并 lambda 将由 cloudwatch 每 x 分钟 触发一次,其中 x 是所有 lambda 的平均 运行 时间(以分钟为单位)。 一旦所有序列都存在,它会将它们合并到一个文件中,您可以将该输出保存在另一个 S3 存储桶中,并删除序列存储桶中的所有现有序列。

注意:在此设计中添加 aws 步进函数 可以是一个很好的替代方案,可以改进控制,但会对价格产生很大影响。

当我们异步调用 lambda 时,上图的行为类似于下图

您还可以使用 https://github.com/alexcasalboni/aws-lambda-power-tuning

调整任务所需的内存以提高性能

编辑:

序列创建器代码应该类似于下面的示例代码--> 这是一个示例代码:

workers = 3
payload = [{"payload1":"1"},{"payload2":"2"},{"payload3":"3"}]
for i in range(workers):
    lambda_client.invoke(FunctionName='sequence',InvocationType='Event',Payload=json.dumps(workers_payload[i]))