【问题标题】:AWS solution for processing many API calls in parallel用于并行处理多个 API 调用的 AWS 解决方案
【发布时间】:2022-01-15 01:23:10
【问题描述】:

我们正在准备从我们的分析门户网站收集数据的解决方案,我们正在使用 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、Step Functions/Parallel 流、Lambda 中提到的解决方案吗?

我的序列创建者(主要 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));

【问题讨论】:

  • 能否请您详细解释一下Each concurrent Lambda will be responsible for part of the work (10% of the clients, 10% of the API calls) 这一行,因为 lambdas 应该只负责一项任务。
  • 例如,如果我们有 100 个客户,我们需要收集所有 100 个客户的数据。我们可以使用 5 个 Lambda,让它们并行工作,每个 lambda 有 20 个客户,应该会加快进程。

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


【解决方案1】:

假设输出文件很大,那么它不是流数据,

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

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

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

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

您还可以使用 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]))

【讨论】:

  • 好的,序列创建者块的角色是什么?
  • 假设,您有 100 个客户,您正在使用他们的名称从单个端点获取每个客户的数据。然后此函数将调用异步 lambda 函数 100 次,其中负载作为客户名称和端点。 100 个 lambda 函数将并行运行。如果您使用不同的端点为每个客户获取数据,每个客户 1 个,那么您需要调用异步 lambda 100 时间,并将有效负载作为每个客户各自的端点。 100 个 lambda 函数将并行运行。
  • @tester81 序列 1,2,3 只是 N,它们可以根据您要使用序列创建器功能创建的集合的数量来增加和减少,
  • @tester81 我添加了一些示例代码,在图中我使用 3 个 lambda 函数的原因是我想解释调用如何并行工作,这是 3 个函数的场景。对于异步调用,您可以在循环中调用它们并在数组中分配有效负载以及调用其他 lambda 所需的工作人员数量
  • @tester81 我添加了 1 个图表以便更好地理解
猜你喜欢
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2018-01-19
  • 2019-12-19
  • 1970-01-01
相关资源
最近更新 更多