78

我在 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():返回 [{' credits_balance':0}]

第二行是我返回一个值(给 Flask——它是一个 Flask“响应”对象)。

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=屏蔽 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 队列=0 等待=0ms 连接=1ms 服务=19ms 状态=200 字节=0

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

4

1 回答 1

1

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

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

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

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

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

这也将绕过任何数量的其他点对点网络错误,并使应用程序即使在面临连接问题时也更加健壮。

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

于 2013-05-16T10:17:31.973 回答