调用时 heroku 超时错误 H12 API

heroku timeout error H12 when calling API

当我通过我的烧瓶应用程序调用 api 时,我收到了代码为 H12 的 heroku 超时错误。 api 通常在 2 分钟内响应。我通过不同的线程调用 api 以便主烧瓶应用程序线程保持 运行.

    with ThreadPoolExecutor(max_workers=5) as executor:
        future = executor.submit(shub_api, website, merchant.id)
        result = future.result()

Heroku 上有一些关于 运行 后台任务的文档,但是 python 示例是关于使用 Redis 的,我对此一无所知。这个问题还有其他解决方案吗?

这是行不通的,因为 Heroku 的架构方式。

当您的 Web 应用程序部署到 Heroku 时,它 运行 部署在 dynos 上。 Dynos 是“短暂的网络服务器”,只能存在很短的时间。这意味着当用户向您的应用发出请求时,用户的请求将由可能只存在很短时间的测功机处理。

Heroku dynos 不断地启动、停止和移动到其他物理主机。这意味着 web dynos 不应该用于 运行 需要很长时间才能完成的任务(有不同的 worker dynos)。

此外,Heroku dyno 提供的每个 Web 请求都有 30 秒的超时。这意味着,如果有人在 Heroku 上向您的应用程序发出 HTTP 请求,您的应用程序必须在 30 秒内开始响应客户端,否则,您将收到 Heroku's routing layer will issue an H12 TIMEOUT 错误,因为它认为您的应用程序已冻结或卡在某处循环。

总结一下:Heroku 的架构是从头开始设计的,以遵循网络最佳实践,这意味着您的 HTTP 请求可以快速完成(< 30 秒)并且不依赖于您的网络服务器是永久的您可以随时 运行 编写代码的固定装置。

你应该做的是解决这个问题,而不是使用后台工作进程(本质上它只是第二种类型的 dyno 你可以 运行 上面的一些代码将处理 long-运行 ning 任务)并让您的 Web 应用程序向您的工作进程发送通知以开始 运行ning 您的任务代码。

这通常是通过 Redis、AWS SQS 等消息队列完成的。This Heroku article 更详细地解释了这个概念。