【问题标题】:Lambda timeouts with calls to external api when scaling up扩展时调用外部 api 的 Lambda 超时
【发布时间】:2022-01-13 07:26:52
【问题描述】:

我已经设置了一个 lambda A (Nodejs),它通过同步调用其他 lambdas B、C、D、...来收集数据。这些其他 lambda 调用外部 API。问题是当有流量时,这些其他 lambdas (B,C,D, ...) 会超时他们对这个外部 API 的请求。只需一次调用 Lambda A,这些其他 Lambda 将在不到一秒的时间内执行其外部 api http 请求,但在负载下,时间不断增加。

超时设置为 10 秒,因此可以重新尝试,但我尝试将其更改为一分钟,以查看是否得到响应,并且确实发生了。似乎没有足够的 something 可用并且后续请求排队。

日志中没有错误(关于达到 AWS 限制)并且我没有达到 AWS 并发限制。我还认为我可能会达到突发并发限制,但日志中没有错误。

(图表显示每分钟的总和)

如果只有 366 次调用,ConcurrentExecutions 怎么会这么高?

我已经开始摆弄 maxSockets(我不知道 Infinity 仅等于 50),但我认为它目前设置不正确。然而,这可能是这种情况吗?一次只能处理 50 个连接,其余的要排队?

下面的代码(模拟)。

const soapConfig = {
  endpoint: 'https://soapapi.com',
  options: { timeout: 29000, time: true, pool: { maxSockets: Infinity },
    wsdl: `${__dirname}/ASC2021.wsdl`
  }
}

const handler = (event, context, callback) => {
  let processed = (async function () {
    let params = Object.assign({}, event.pathParameters, event.queryStringParameters)
    const client = await soap.createClientAsync(soapConfig.wsdl,
      soapConfig.options, soapConfig.endpoint)
    const result = await client.GetData(params, soapConfig.options)
    return result
  })()
  postProcess(processed, context, callback)
}

AWS_NODEJS_CONNECTION_REUSE_ENABLED 设置为 1

我正在打的some队列某处可以吗?

编辑:我忘了补充一点,我已经与 API 维护者进行了详细的讨论,并且调用甚至没有到达所述 api。如果超时提高到所述 1 分钟,则 api 接收请求但接近请求结束。 API 也没有限制。

【问题讨论】:

    标签: amazon-web-services aws-lambda concurrency timeout


    【解决方案1】:

    正如https://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics.html 的“使用性能指标”中所述,您应该对“并发执行”使用“最大”指标而不是“总和”。 使用“Sum”没有意义。

    根据您对用例的解释,您似乎可以每秒调用外部 API 的 API 限制(根据您的信息,可能每秒 50 个请求)。 当您超过限制时,您的 lambda 重试会导致更长的执行时间,最终在负载下超时。 您可以利用 lambda 的 ReservedConcurrency 功能来限制您的 lambda 超出外部 api 限制。 并且,在限制错误代码上应用一些退避逻辑,以优雅地处理您的下游服务。

    【讨论】:

    • 感谢您的提示。我忘了提及,虽然我已经与 API 维护人员讨论过,但问题还没有结束。除非引发超时,否则这些调用甚至不会到达它们的 API。所以这绝对是我的结局。
    • 您的 lambda 是否使用任何可能成为请求瓶颈的下游服务?不可能没有限制。 API 维护者必须不知道。即使是声称可以毫不费力地无限扩展的 AWS 也有局限性。
    • 没有。没有下游服务。而且如果API端有限制,也不在我的范围内。即使只有 20 个并发请求也会出现问题。
    • 我部署了多个项目,一次并发执行次数为 100 到 3000。只有当下游 API 限制成为瓶颈时,他们才会遇到类似的问题。而且,我所要做的就是利用 ReservedConcurrency 来控制。
    • 感谢您的意见。我们查看了外部 api 的日志,当请求最终到达 API 时,它们最多可以在几秒钟内得到处理。当然,可能还有其他东西限制了他们的请求,但我现在必须接受他们的意见,并相信这不是他们的目标。但是,现在当我想到它时,限制并发可能是一个很好的解决方法。如果有太多并发实例正在运行,这将允许 AWS 开发工具包重新尝试。谢谢。
    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 2020-03-21
    • 2021-05-24
    • 1970-01-01
    • 2012-08-22
    • 2022-01-04
    • 2020-09-14
    • 2019-11-15
    相关资源
    最近更新 更多