这让我真的很困惑,希望有人对此有一些见解。 我们使用 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 错误而失败。
我们可以改变我们的设计:
但这并不是一次微不足道的重新设计和重构。可能需要 6 天的开发/测试工作 - 我们没有。
但是我会非常感谢任何对这个问题有任何宝贵见解的人。善于进行对话并分享一些想法。
谢谢各位好心人!
在本地,通过我们的计算机,此功能非常可靠。但是,当我们的程序在 ECS 中运行时,我们会收到 NET::Timeout TCP 套接字错误。 Lambda 将调用 X 次。
如果它仍然能够从 ECS 调用 Lambda 函数,但超时,可能是它们之间的网络中的某个地方超时了,比如 ECS、负载均衡器、代理等?可能值得研究。
如果没有所有细节,很难知道,但总的来说,我可能会选择异步设计,因为它将能够更好地扩展和处理故障。您的线程可以将消息推送到 Lambda 函数从中读取的 SQS 队列,而不是直接异步调用 Lambda 函数。