【问题标题】:Can I spread the invocations of AWS Lambda out over a 5-minute interval?我可以将 AWS Lambda 的调用分散在 5 分钟的时间间隔内吗?
【发布时间】:2019-08-10 04:54:27
【问题描述】:

我有一个 5 分钟重复运行的 Lambda。它为每个用户执行一次数据处理任务(查询第三方 API 并处理响应)。这会每 5 分钟产生一次数据峰值。

我想将数据峰值转换为每秒均匀分布的数据。有什么方法可以在 5 分钟内将重复的任务分散到多个 Lambda 调用中,以实现更均匀的数据分布?

我的目标是随着时间的推移获得均匀分布的数据输出,这样我就可以将其传输到 AWS Kinesis,就好像它是实时流数据一样。

编辑:

现在,我的 Lambda 通过 Cloudwatch 事件每 5 分钟运行一次。它向我的服务器查询用户 API 密钥,然后查询第三方 API,处理结果并将其存储在 DynamoDB 中。

我想将负载平均分布在 5 分钟内,以便每秒处理一批用户,从而产生均匀的输出。

我想我可以在 Memcached 中将我的用户群分成 300 个存储桶(每秒 5 分钟一个),然后运行一个小型 EC2 实例,该实例将从 Memcached 获取存储桶并每秒为每个存储桶触发一个 Lambda。有没有更好的方法来实现这一点?

【问题讨论】:

  • 您能进一步详细说明您的堆栈吗?您的 lambda 是如何触发的(cloudwatch 事件规则或其他方式)?您的 lambda 处理数据的来源是什么?
  • @congbaoguier 我更新了问题
  • 这个提议的架构在让您当前的 Lambda 更频繁地发布到 Dynamo 之上,给您带来了什么,即循环访问您的用户并在每 x 次调用 3rd 方 api 后发布结果?
  • 可能是带有迭代器模式的 AWS Step Functions(请参阅 read.acloud.guru/…
  • 如果您的 ec2 基本上是非空闲的,这实际上是一个好主意。不过,您可能想要计算出您将拥有多少确切的空闲时间,并根据每秒 Lambda 方法计算成本。无服务器并不是所有事情的最佳解决方案。这只是一个选择。仅在与使用大部分空闲的 ec2 实例相比确实节省资金时才使用它。

标签: amazon-web-services aws-lambda amazon-kinesis


【解决方案1】:

我目前假设您需要限制您的 API 调用,因为第三个 API 速率限制了服务。

有几种方法可以解决此问题,因此请选择最适合您的方法。我的看法是保持简单/无服务器,每秒调用第二个 lambda 来处理一批用户。

事件:

  1. Cloudwatch 事件每 5 分钟调用一次 Lambda A
  2. Lambda A 从“私有服务器”获取 API 密钥和要查询的用户列表
  3. Lambda A 将用户列表拆分为 5 分钟)
  4. Lambda A 按顺序同步处理

从 Lambda B 到第 3 方服务器的传出 GET 请求应该相当均匀,每秒约 1 个请求。另一方面,响应时间和写入 dynamoDb 可能会有所不同。

【讨论】:

  • 如果我们将用户分成约 300 个块并每秒运行一个块,这意味着我有一个持续运行的 Lambda,大部分是空闲的,花费了很多美元。因此,为什么我认为 Lambda A 作为一个便宜的 EC2 实例会更好。你怎么看?
  • 是的,Lambda 成本将比 EC2 贵,但很大一部分将来自 Lambda B。假设我们完全超出了免费层并运行 128MB lambda。 Lambda 请求成本 ~ 每月 0.6 美元 - LambdaA 每月调用 8750 次。 (5 分钟间隔)- LambdaB 每月调用 2,625,000 次(300 块)Lambda 持续时间成本 ~ 每月 33 美元 - LambdaA 每月运行 2,625,000 秒(5 美元)- LambdaB 每月运行 13,125,000 秒(28 美元) (5 秒调用)T2.nano EC2 实例每月花费约 4-5 美元。 (还需要考虑数据传输成本)
  • 因此,如果成本是主要驱动因素,那么也许转向一个小型 ec2 实例以包含 LambdaA 和 LambdaB 逻辑可能是前进的方向。
  • 我的想法是 Lambda A 必须连续运行 5 分钟才能以每秒 1 个块的速度处理 300 个块。它将处理一个块并调用 Lambda B,然后等待,然后处理另一个块并调用 Lambda B,然后等待,等等。这意味着 Lambda A 不断运行。还是我错过了什么?
  • 是的,它将连续运行 5 分钟,但不是 24/7。每个 cloudwatch 触发器都会调用一个单独的 Lambda。它不会导致相同的 lambda 继续运行。因此,如果您有 >300 个块,间隔为 5 分钟,您可以有重叠,并且有 2 个 Lamdba A 在短时间内同时运行。仅供参考,lambda 调用的最大运行时间是 15 分钟
猜你喜欢
  • 1970-01-01
  • 2020-07-30
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多