Heroku截断HTTP响应?

Nit*_*ked 78 python json heroku flask gunicorn

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

偶尔客户端获得0字节响应.然而,不是我回来了.这是我的应用程序日志的片段:

3月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 ]

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

3月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():returns [{' credits_balance':0}]

第二行是我返回一个值(给Flask - 它是一个Flask"Response"对象).

3月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路由器日志:

3月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 queue = 0 wait = 0ms connect = 1ms service = 19ms status = 200 bytes = 0

为什么Gunicorn返回22个字节,但是Heroku看到0,确实将0个字节传回给客户端?这是一个Heroku bug吗?

Mat*_*att 1

我知道我可能会被认为有点离谱,但还有另一种选择。

我们知道,运输途中时不时会出现错误。我们知道,现在我们无能为力来阻止这个问题。如果您只提供 API,那么请停止阅读,但如果您也编写客户端,请继续阅读。

该错误是已知情况和已知原因。空返回值的结果意味着出现了问题。然而,该值是可用的,并且已被获取、计算,等等......作为开发人员,我的本能是将空结果视为 HTTP 错误并请求重新发送数据。然后,您可以跟踪重新发送请求并查看这种情况发生的频率。

我建议(尽管我觉得你是那种也会考虑到这一点的开发人员)对请求进行计数并设置一个合理的值来向用户响应“网络错误”。我的直觉是立即重试,然后等待一段时间再重试。

根据您的描述,第一次重试可能会正确获取数据。当然,这可能意味着将较旧的请求在缓存中保留几分钟或根据最合适的方式再次运行该请求。

这还可以绕过任何其他点对点网络错误,并使应用程序即使面对连接问题也更加健壮。

我知道作为开发人员,我们的本能是修复已知的故障,但有时最好是努力建立一个尽管有故障也能运行的系统。也就是说,记录错误和问题并尝试修复它们总是没有坏处的。