【问题标题】:heroku timeout error H12 when calling API调用API时heroku超时错误H12
【发布时间】:2021-02-16 13:17:33
【问题描述】:

当我通过我的烧瓶应用程序调用 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。这个问题还有其他解决方案吗?

【问题讨论】:

    标签: python flask heroku python-multiprocessing python-multithreading


    【解决方案1】:

    由于 Heroku 的架构方式,这不起作用。

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

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

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

    总结一下:Heroku 的架构是从头开始设计的,以遵循 Web 最佳实践,这意味着让您的 HTTP 请求快速完成(

    您应该改为使用后台工作进程来解决此问题(本质上它只是第二种类型的测功机,您可以在其上运行一些代码来处理长时间运行的任务)并让您的 Web 应用程序发送通知到您的工作进程以开始运行您的任务代码。

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

    【讨论】:

      猜你喜欢
      • 2012-07-08
      • 1970-01-01
      • 2017-06-10
      • 2012-06-14
      • 2021-05-10
      • 2020-07-09
      • 2019-12-15
      • 2020-01-26
      • 1970-01-01
      相关资源
      最近更新 更多