由于 json 大小,http 请求失败 - 响应 503 和 Heroku 错误 H13

Posted

技术标签:

【中文标题】由于 json 大小,http 请求失败 - 响应 503 和 Heroku 错误 H13【英文标题】:http request fails due to json size - response 503 and Heroku error H13 【发布时间】:2014-11-15 12:44:26 【问题描述】:

我在 heroku 上运行了一个简单的烧瓶应用程序:

from flask import Flask
app = Flask(__name__)

@app.route('/test', methods=['POST'])
def test():
    return 'OK'

难以置信的是,它成功或失败,取决于我发送的 json 的大小。这是测试代码:

import json, random, string, requests

def rand_string(size):
    return ''.join([random.choice(string.letters) for i in xrange(size)])

for size in (4000, 10000):
    r = requests.post('http://my-app.herokuapp.com/test',
                      data=json.dumps(rand_string(size)),
                      headers='content-type': 'application/json')
    print r.status_code

第一次调用时返回状态 200,第二次 http 状态为 503 并带有 H13 heroku 错误代码。

2014-09-18T08:23:46.594543+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=POST path="/test" host=my-app.herokuapp.com request_id=91b1cd91-5a4f-445e-ad52-3c64733154b3 fwd="12.34.56.78" dyno=web.1 connect=5ms service=13ms status=503 bytes=0

HTTP response 503 表示:

由于临时原因,服务器当前无法处理该请求 服务器超载或维护

这不可能,因为服务器已启动并运行,除了我的手动测试外没有任何负载。

Heroku 的 H13 code documentation 说:

当您的 web dyno 中的进程接受 连接,但随后关闭套接字而不向其写入任何内容。

但是所有代码都是return 'OK',所以它不是代码。

heroku 是否限制请求的大小?有独角兽吗? 我怎样才能找到它以及如何配置它?

【问题讨论】:

【参考方案1】:

您可能受到 gunicorn 的超时机制的影响,默认为 30 秒。如果由于某种原因序列化需要更长的时间,worker 将被杀死并重新启动。

【讨论】:

以上是关于由于 json 大小,http 请求失败 - 响应 503 和 Heroku 错误 H13的主要内容,如果未能解决你的问题,请参考以下文章

RESTful json 响应在 tomcat 上失败,但在 GlassFish 中有效

使用JSON主体的HTTP GET请求是否有大小限制?

请求失败时从 AlamoFire 获取 JSON 响应

AWS Java Lambda 压缩 JSON 响应失败:“由于配置错误,执行失败:格式错误的 Lambda 代理响应”

响应浏览器的最大 json 大小

如何发出 jsonp 请求