如何使用 python flask 长时间 运行 工作负载来防止 230 秒 azure 网关超时

How to prevent the 230 seconds azure gateway timeout using python flask for long running work loads

我有一个 python flask 应用程序作为 azure web 应用程序,其中一个功能是计算密集型工作负载,需要超过 5 分钟才能处理,是否有任何 hack 可以通过保持函数处理数据时,客户端与 api 之间的 TCP 连接处于活动状态?当前代码示例如下。

from flask import Flask

app = Flask(__name__)

@app.route('/data')
def data():
    mydata = super_long_process_function()
    # takes more than 5 minutes to process
    return mydata 

由于 super_long_process_function 需要超过 5 分钟,它总是超时 504 网关超时 。我想提及的一件事是,这是 TCP 级别的空闲超时,这意味着如果连接仅处于空闲状态并且没有数据传输发生,则只有此超时才会发生。那么在我们处理数据时,flask 中是否有任何 hack 可以用来防止超时,因为根据我的研究和阅读 Microsoft 文档,网络应用程序不能更改 230 秒限制。

简而言之:230秒的超时时间,正如你所说,无法更改

230 seconds is the maximum amount of time that a request can take without sending any data back to the response. It is not configurable.

来源:GitHub issue

无响应超时。保持连接打开并发送数据无济于事。

您可以通过多种方式解决此问题。这里有两种可能的解决方案,您可以使用这些解决方案来触发长时间的 运行 任务,而不会出现超时问题。

  1. 只有 触发 具有 HTTP 调用的长 运行 任务,但在返回响应之前不要等待它们完成。
  2. 使用 Storage Queues or Service Bus.
  3. 等消息传递机制触发任务

为了使用长 运行 任务的结果更新 Web 应用程序,请考虑让响应保持 URL 前端可以调用以定期检查任务完成情况,您的请求具有回调 URL 以在任务完成时调用或实施 Azure Web PubSub 以向客户端发送状态更新。