我在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错误吗?
答案 0 :(得分:1)
我知道我可能会被认为有点偏离障碍,但还有另一种选择。
我们知道在运输过程中会不时发生错误。我们知道现在我们无法做很多事情来阻止这个问题。如果您只提供API然后停止阅读,但是如果您也编写客户端,请继续。
错误是已知的情况,也是已知原因。返回值为空的结果意味着出错了。然而,这个值是可用的,并且被提取,计算,无论如何......我作为开发人员的本能是将空结果视为HTTP错误并请求重新发送数据。然后,您可以跟踪重新发送的请求,并查看这种情况发生的频率。
我建议(虽然你让我觉得这种想法也是开发人员)你计算请求并设置一个合理的值来回应用户的“网络错误”。我的直觉是立即重试然后再等一会儿再重试一次。
根据您的描述,第一次重试可能会正确地获取数据。当然,这可能意味着将旧请求挂在缓存中几分钟,或者根据最合适的情况再次运行请求。
这也会绕过任意数量的其他点对点网络错误,即使面对连接问题,也能让应用程序更加强大。
我知道我们的直觉,因为开发人员要解决已知的故障,但有时候最好是朝着能够在故障情况下运行的系统工作。也就是说,记录错误和问题并尝试修复它们永远不会伤害。