Heroku截断HTTP响应?

时间:2013-03-14 14:04:21

标签: 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():return [{'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]”发布   / 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 [路由器]   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错误吗?

1 个答案:

答案 0 :(得分:1)

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

我们知道在运输过程中会不时发生错误。我们知道现在我们无法做很多事情来阻止这个问题。如果您只提供API然后停止阅读,但是如果您也编写客户端,请继续。

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

我建议(虽然你让我觉得这种想法也是开发人员)你计算请求并设置一个合理的值来回应用户的“网络错误”。我的直觉是立即重试然后再等一会儿再重试一次。

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

这也会绕过任意数量的其他点对点网络错误,即使面对连接问题,也能让应用程序更加强大。

我知道我们的直觉,因为开发人员要解决已知的故障,但有时候最好是朝着能够在故障情况下运行的系统工作。也就是说,记录错误和问题并尝试修复它们永远不会伤害。

相关问题