Flask request.data 很慢

Flask request.data is slow

我们在亚洲和美国有一些客户,我们在处理他们的 POST 请求时调用 request.data 时看到了这种奇怪的行为:

我们使用cProfile得到了上面的数据,所以应该是准确的(我想?)。每个客户端的有效载荷在 50 - 700 字节之间变化,但似乎没有表现出任何模式(新加坡客户端有一个中等大小的 POST 有效载荷,而中国客户端有一个小尺寸)

查看 this question 后,我怀​​疑我们遇到了类似的情况,即在收到 headers 后立即处理请求,因此调用 request.data 块直到完整POST 收到有效负载。我猜中国客户端是最慢的,因为 GFW 减慢了 POST 有效负载的传输。

我有两个问题:

  1. 分析的有道理吗?
  2. 我该如何解决这个问题?上述行为似乎效率很低,因为我的 API 实例被阻塞了额外的时间并浪费了 CPU 周期。如果在发送到 API 实例
  3. 之前完全接收到请求,它似乎会工作得更好

FWIW,我继承了这个代码库,我的理解可能存在一些差距,但我们的 DCOS 架构类似于下图。我尝试在外部马拉松 LB 中寻找配置选项以增加缓冲或仅发送完全接收到的请求,但我没有找到这样的选项。

看来我想通了!

显然 Marathon LB 是 HAProxy 的包装器,HAProxy 有一种机制可以在将其转发到后端之前接收完整的 HTTP 请求负载。将 http-buffer-request 选项添加到 Marathon-LB 配置似乎已经成功了!