【发布时间】:2013-03-02 22:24:08
【问题描述】:
我正在 Heroku Cedar 测功机上运行 Flask/Gunicorn Python 应用程序。该应用程序将JSON responses 返回给其客户(实际上是API server)。
客户端偶尔会收到 0 字节的响应。然而,不是我归还它们。这是我的应用程序日志的 sn-p:
3 月 14 日 13:13:31 d.0b1adf0a-0597-4f5c-8901-dfe7cda9bce0 应用程序[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 应用程序[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 应用程序[web.1] “10.104.41.136 - - [14/Mar/2013:13:13:31] “发布 /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[路由器] at=info 方法=POST 路径=/get_credits_balance?session_token=MASKED 主机=matchspot-apisrv.herokuapp.com fwd="66.87.116.128" dyno=web.1 队列=0 等待=0ms 连接=1ms 服务=19ms 状态=200 字节=0
为什么 Gunicorn 返回 22 个字节,但 Heroku 看到 0,并且确实将 0 个字节传回给客户端?这是 Heroku 的错误吗?
【问题讨论】:
-
你注意到了吗,heroku 时间戳在你的进程时间戳之前?你用gevent吗?我认为同步有问题。
-
然而,时间戳表示 1 秒的差异,而不是 1 1 毫秒......我没有使用 heroku,所以这只是建议。 1ms 和 1999ms 都可以给你 1 秒的时间戳差异。服务 19ms 在云服务上也太低了,无法实现。所以我的意思是,可能存在某种超时和超时而不是错误 heroku 服务空页面。这个建议很长,但也许你应该效仿 long request 看看会发生什么
-
当您与 Heroku 联系时(出于好奇)对他们有多大帮助?
-
到目前为止还不是很多。我在 10 天前找到了他们,并被告知 Python 人员会先查看它,如果他们无法帮助我,那么路由人员会查看。 5 天后,我被告知 Python 人员已将此传递给路由人员,今天我收到一封来自“路由人员”的电子邮件,说他无法重新创建并要求提供更多信息。所以是的,他们正在通过正确的过程,但这需要永远。
-
小更新:尚未解决。我一直在与 Heroku 支持来回通信,我现在能收集到的最好的结果是他们并没有以“它在你的尽头”而解雇我,并且正在尝试编写一个工具来 tcpdump-capture 应用程序流量, 用于“调试这样的案例”。
标签: python json heroku flask gunicorn