如何在发送HTTP 204之前刷新Flask中的标头?

时间:2015-02-27 17:55:25

标签: python flask http-headers flush

我有一个Flask REST服务,其中一个POST操作可能需要很长时间(例如30秒)才能返回HTTP 204 No Content。

该服务托管在两个充当故障转移的服务器上,Nginx决定应该使用哪个服务器,Nginx配置为:

upstream demo-failover {
    server http-demo-primary.example.com weight=1000 max_fails=0;
    server http-demo-failover.example.com backup;
}

server {
    server_name demo.example.com;
    proxy_next_upstream error timeout invalid_header;
    proxy_connect_timeout 2;
    proxy_redirect off;
    proxy_read_timeout 240s;
}

在执行相关的POST请求时,Nginx会将其发送到http-demo-primary,由于它在两秒内没有收到任何响应,因此放弃并向http-demo-failover发出另一个请求。显然,这不合适:因为第一台机器启动并运行,Nginx不应该故障转移到第二台机器。

我认为发送标头 - 实际上任何标头都可以从服务中获取技巧 - 足以让Nginx了解机器是否处于活动状态并且它不应该故障转移到另一个。

我知道如何在PHP和ASP.NET中完成它。另一方面,我在Flask中找到的唯一类似的东西是官方文档的Streaming Contents部分,在我的情况下似乎不合适,其中响应是HTTP 204。

如何在服务器返回的实体主体为空的上下文中刷新一些头文件?

1 个答案:

答案 0 :(得分:0)

长时间运行HTTP请求通常是一个坏主意。相反,请考虑快速返回HTTP 202 Accepted响应,然后异步执行长时间运行的处理。如果客户端需要知道请求何时完成,您可以返回一个Location标头,其中包含客户端可以轮询该任务状态的URL。