http-запрос не работает из-за размера json - ответ 503 и ошибка Heroku H13

У меня есть простое фляжное приложение, работающее на героку:

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 с кодом ошибки heroku H13.

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-ответ 503 означает:

сервер в настоящее время не может обработать запрос из-за временной перегрузки или технического обслуживания сервера

Этого не может быть, так как сервер запущен и работает без нагрузки, кроме моих ручных тестов.

В документации по коду H13 от Heroku говорится:

Эта ошибка возникает, когда процесс в вашем веб-дино принимает соединение, но затем закрывает сокет, ничего не записывая в него.

Однако все, что делает код, это return 'OK', так что это не код.

Ограничивает ли heroku размер запросов? Есть ли gunicorn?
Как узнать и как настроить иначе?


person Jonathan    schedule 21.09.2014    source источник


Ответы (1)


Возможно, на вас повлиял механизм тайм-аута gunicorn, который по умолчанию равен 30 секундам. Если сериализация по какой-то причине занимает больше времени, рабочий процесс уничтожается и перезапускается.

person dodecaphonic    schedule 19.03.2015