У нас есть проект, размещенный на Google App Engine в гибкой среде Node.js для сбора данных с датчиков.
Мы получаем около 10 POST /collect
запросов в секунду, которые могут быть самого разного размера, но в 99% случаев это очень маленькие запросы (~100B до ~12MB).
Глядя на собранные данные, мы видим, что время от времени (например, 5-6 раз в день) мы пропускаем какие-то данные.
Во время инвестирования мы поставили прокси (все еще на App Engine), назовем его PROXY перед нашим сервером, назовем его SERVER, чтобы можно было отслеживать полный поток и увидеть все ошибки и проблемы, с которыми мы могли столкнуться.
Мы заметили, что при отсутствии данных PROXY отправил данные на SERVER и получил обратно 502 Bad Gateway, и это отображается в PROXY. логи (в прокси печатаем когда приходит запрос на прокси и когда сервер отвечает на прокси):
07:11:15.000 SENSOR_ID response: 502 Bad Gateway
07:11:15.000 SENSOR_ID request
Затем мы просмотрели журналы SERVER и обнаружили, что с той же отметкой времени мы получаем следующее:
07:11:15.000 [error] 32#32: *84209 upstream prematurely closed connection while reading response header from upstream, client: 130.211.1.151, server: , request: "POST /collect HTTP/1.1", upstream: "http://172.17.0.1:8080/collect", host: "ourprojectid.appspot.com"
Наше первое предположение заключалось в том, что большие запросы с большим количеством данных по какой-либо причине вызвали сбой сервера, но это не так, и вместо этого нет корреляции между этими событиями сбоя и размером запроса.
Стек, который мы используем: экземпляры App Engine (работающие на nginx) и гибкая среда Nodejs.
Мы понятия не имеем, где проводить дальнейшее расследование.