用于并行处理许多 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]))
我们正在准备从我们的分析门户网站之一收集数据的解决方案,我们正在使用 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]))