使用 Ruby AWS SDK 在线程中调用同步 Lambda 时出现 NetTimeout

问题描述 投票:0回答:1

这让我真的很困惑,希望有人对此有一些见解。 我们使用 Ruby 和 AWS SDK 同步调用 AWS Lambda。 Lambda 完成所需的时间“通常”不超过 7 分钟。

AWS 控制台中为 Lambda 定义的超时为 600 秒(10 分钟) 我们的 AWS Lambda 客户端对象的配置是:

{
  http_read_timeout: 600,
  max_attempts: 1,
  retry_limit: 0
}

我们有一个需求,需要在线程中多次调用这个 Lambda。每个线程将使用不同的 AWS Lambda 客户端对象(但具有相同的上述配置)以及在调用时传递到其中的不同事件负载。我们的程序等待所有执行调用的线程完成。

在本地,通过我们的计算机,此功能非常可靠。但是,当我们的程序在 ECS 中运行时,我们会收到 NET::Timeout TCP 套接字错误。 Lambda 将调用 X 次。 Lambda 中的代码将会成功。但是执行调用的线程中的 AWS Lambda 客户端在未收到 Lambda 响应的情况下达到 600 超时,并因 NET::Timeout TCP 错误而失败。

我们可以改变我们的设计:

  • 异步调用 Lambda N 次。
  • 每次调用都会以 AWS SNS 主题的形式发布结果。
  • AWS SQS 队列订阅该主题,传入消息进入队列
  • 我们的程序然后轮询 SQS 队列,检索消息并完成反馈循环。

但这并不是一次微不足道的重新设计和重构。可能需要 6 天的开发/测试工作 - 我们没有。

但是我会非常感谢任何对这个问题有任何宝贵见解的人。善于进行对话并分享一些想法。

谢谢各位好心人!

  • 我们的方法和程序可以在我们的计算机本地可靠地运行。
  • 当我们的程序作为 ECS 中的微服务运行时,问题会重现。
  • 我打算在 Docker 容器中本地测试一下,看看会发生什么。我想知道这是否与 Docker 容器内可用套接字的限制有关?
ruby docker aws-lambda amazon-ecs aws-sdk-ruby
1个回答
0
投票

在本地,通过我们的计算机,此功能非常可靠。但是,当我们的程序在 ECS 中运行时,我们会收到 NET::Timeout TCP 套接字错误。 Lambda 将调用 X 次。

如果它仍然能够从 ECS 调用 Lambda 函数,但超时,可能是它们之间的网络中的某个地方超时了,比如 ECS、负载均衡器、代理等?可能值得研究。

如果没有所有细节,很难知道,但总的来说,我可能会选择异步设计,因为它将能够更好地扩展和处理故障。您的线程可以将消息推送到 Lambda 函数从中读取的 SQS 队列,而不是直接异步调用 Lambda 函数。

© www.soinside.com 2019 - 2024. All rights reserved.