Heroku截断HTTP响应?

我在Heroku Cedar dyno上运行Flask / Gunicorn Python应用程序。 该应用程序返回JSON responses到它的客户端(这真的是一个API server )。

偶尔,客户端得到0字节的响应。 但是,这不是我回来的。 这是我的应用程序日志的一个片段:

Mar 14 13:13:31 d.0b1adf0a-0597-4f5c-8901-dfe7cda9bce0 app [web.1] [2013-03-14 13:13:31 UTC] 10.104.41.136 apisrv – api_get_credits_balance():session_token = [MASKED ]

上面的第一行是我开始处理请求。

Mar 14 13:13:31 d.0b1adf0a-0597-4f5c-8901-dfe7cda9bce0 app [web.1] [2013-03-14 13:13:31 UTC] 10.104.41.136 apisrv 1252148511 api_get_credits_balance():returning [{' credits_balance':0}]

第二行是我返回一个值(对Flask – 这是一个Flask“Response”对象)。

Mar 14 13:13:31 d.0b1adf0a-0597-4f5c-8901-dfe7cda9bce0 app [web.1]“10.104.41.136 – – [14 / Mar / 2013:13:13:31]”POST / get_credits_balance?session_token = MASKED HTTP / 1.1“200 22” – “”Appcelerator Titanium / 3.0.0.GA(iPhone / 6.1.2; iPhone OS; en_US;)“

第三行是Gnicorn,在那里你可以看到Gunicorn得到了200个状态和22个字节的HTTP体(“ 200 22 ”)。

但是,客户端得到了0个字节。 这里是Heroku路由器日志:

Mar 14 13:13:30 d.0b1adf0a-0597-4f5c-8901-dfe7cda9bce0 heroku [router] at = info method = POST path = / get_credits_balance?session_token = MASKED host = matchspot-apisrv.herokuapp.com fwd =“66.87。 116.128“dyno = web.1队列= 0等待= 0ms连接= 1ms服务= 19ms状态= 200字节= 0

为什么Gunicorn返回22个字节,但Heroku看到0,并确实传回0字节到客户端? 这是一个Heroku的错误?

我知道我可能会被认为有点离开这里,但还有另一种select。

我们知道不时有一个在运输过程中发生的错误。我们知道,我们现在没有太多的办法来阻止这个问题。 如果你只是提供API,然后停止阅读,但如果你写客户端,继续前进。

错误是一个已知的情况,并已知的原因。 返回空值的结果意味着出错了。 然而,价值是可用的,并被提取,计算,无论…我作为一个开发人员的本能将把一个空的结果作为一个HTTP错误,并要求重新发送数据。 然后,您可以跟踪重新发送请求并查看发生这种情况的频率。

我会build议(尽pipe你也认为我也是这样的开发者),你可以计算这些请求,并为用户响应“networking错误”设置一个合理的价值。 我的直觉就是马上重试,然后再等一会再试一次。

从你描述的第一次重试可能会正确地拿起数据。 当然,这可能意味着将旧的请求在caching中挂起几分钟,或者根据最合适的次数再次运行请求。

这也会绕过任何其他的点对点networking错误,即使面对连接问题,应用程序也会更加强大。

我知道我们的本能,因为开发人员是要修复已知的故障,但是有时候最好还是努力工作,使系统能够在故障情况下运行。 这就是说,logging错误和问题从未受伤,并尝试解决它们。