我有一个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。
如何在服务器返回的实体主体为空的上下文中刷新一些头文件?
答案 0 :(得分:0)
长时间运行HTTP请求通常是一个坏主意。相反,请考虑快速返回HTTP 202 Accepted
响应,然后异步执行长时间运行的处理。如果客户端需要知道请求何时完成,您可以返回一个Location
标头,其中包含客户端可以轮询该任务状态的URL。