Heroku обрезает HTTP-ответы?

Я запускаю приложение Flask/Gunicorn Python на сироте кедра Heroku. Приложение возвращает JSON responses своим клиентам (это действительно API server).

Время от времени клиенты получают 0-байтные ответы. Однако я не возвращаю их. Вот фрагмент моего журнала приложений:

Mar 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]

В первой строке выше я начинаю обрабатывать запрос.

Mar 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 - это объект "Отклик" "Колба" ).

Mar 14 13:13:31 d.0b1adf0a-0597-4f5c-8901-dfe7cda9bce0 app [web.1] "10.104.41.136 - - [14/Март/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's, где вы можете увидеть, что Gunicorn получил статус 200 и 22 байта HTTP-тела ( "200 22" ).

Однако клиент получил 0 байт. Вот журнал маршрутизатора Heroku:

Mar 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 queue = 0 wait = 0ms connect = 1ms service = 19ms status = 200 bytes = 0

Почему Gunicorn возвращает 22 байта, но Heroku видит 0 и действительно передает обратно 0 байтам клиенту? Является ли это ошибкой Heroku?

Ответ 1

Я знаю, что меня можно считать немного у стены, но есть и другой вариант.

Мы знаем, что время от времени появляется ошибка, которая происходит при транзите. Мы знаем, что сейчас мало что можно сделать, чтобы остановить проблему. Если вы предоставляете API только тогда, прекратите читать, но если вы тоже напишите клиент, продолжайте.

Ошибка - это известный случай и известная причина. Результат пустого возвращаемого значения означает, что что-то пошло не так. Однако значение доступно и было выбрано, вычислено, независимо от того... Мой инстинкт как разработчик должен обрабатывать пустой результат как ошибку HTTP и запрашивать, чтобы данные были повторно отправлены. Затем вы можете отслеживать запросы повторной отправки и видеть, как часто это происходит.

Я бы посоветовал (хотя вы напомнили мне, что разработчик тоже подумал об этом), что вы подсчитываете запросы и устанавливаете разумное значение для ответа "сетевой ошибки" на пользователя. Моим инстинктом было бы сразу же повторить попытку, а затем немного подождать, прежде чем повторить попытку.

Из того, что вы описали, первая повторная попытка, вероятно, правильно подберет данные. Разумеется, это может означать, что старые запросы выполняются в кеше в течение нескольких минут или запускают запрос второй раз в зависимости от того, что, пожалуй, наиболее уместно.

Это также проложит вокруг любого количества других сетевых ошибок в сети "точка-точка" и оставьте приложение более надежным даже перед лицом проблем с подключением.

Я знаю наш инстинкт, поскольку разработчики должны исправить известную ошибку, но иногда лучше работать с системой, способной работать, несмотря на ошибки. Тем не менее, он никогда не боится регистрировать ошибки и проблемы и все равно попытаться их исправить.