Я бегу Колба/Gunicorn Python приложение на Хероку Кедр дино. Приложение возвращает JSON responses
своим клиентам (это действительно API server
).Heroku усекает HTTP-ответы?
Время от времени клиенты получают 0-байтные ответы. Однако я не возвращаю их. Вот отрывок из журнала моего приложения:
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]
Первая строка выше меня начинает обрабатывать запрос.
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}]
Вторая строка мне возвращает значение (для Колбы - это колба "Response" объект).
Mar 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 = MASKED HTTP/1.1" 200 22 "-" "Appcelerator титана/3.0.0.GA (iPhone/6.1.2; iPhone OS; en_US;)"
третьего линия - это Gnicorn's, где вы можете видеть, что Gunicorn получил статус 200 и 22 байта HTTP-объекта («200 22
»).
Однако клиент получил 0 байт. ю Heroku журнала маршрутизатора:
14 марта 13:13:30 d.0b1adf0a-0597-4f5c-8901-dfe7cda9bce0 Heroku [маршрутизатор] при = Информация = метод POST путь =/get_credits_balance session_token = MASKED ? хозяйничать = matchspot-apisrv.herokuapp.com FWD = "66.87.116.128" Dyno = web.1 очереди = 0 ожидания = 0ms подключающиеся = 1мс сервис = 19ms статус = 200 байт = 0
Почему Gunicorn возвращение 22 байта, но Heroku видит 0 и действительно передает обратно 0 байтам клиенту? Это ошибка Героку?
Вы заметили, что героическая метка времени находится перед вашей временной отметкой? Вы используете gevent? Я думаю, что-то не так с синхронизацией. – Tigra
Спасибо, что комментировали. Я использую обычных сотрудников-манипуляторов Gunicorn, а не gevent или любую другую родословную. Интересное наблюдение относительно метки времени, но моя гипотеза будет заключаться в том, что временная метка, написанная Heroku, является меткой времени, когда маршрутизатор * получил * запрос. Просто догадка. Это объясняет разницу в 1сек в метках времени (реальная разница, конечно, может составлять 1 мс, 1 мс, которая скатывается по второму счету от 30 до 31). На этом этапе я должен добавить, что после публикации этого вопроса я включил новую функцию Heroku-labs, которая печатает уникальный «идентификатор запроса» в журналах маршрутизатора Herkou (продолж.) –
(продолжение) и передает это как HTTP-заголовок для моего работника, поэтому я могу сопоставить строки. Линии * do * коррелируют, когда происходят явления. Кроме того, я добавил крюк post-request для пушки, который печатает ответ, и, действительно, gunicorn утверждает, что написал и сбросил все байты ответа. –