metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2014-05-13 07:35 pm

Кролики, Firebird, веб-сокеты и keep-alive в TCP

Периодически на работе сталкиваемся с проблемами вида "TCP-соединение пропало неизвестно куда, клиент ждет ответа сервера, сервер ждет запроса клиента". Лечится это вроде бы модификацией настроек TCP keep-alive.
При этом протоколы с короткими действиями вида "отправили HTTP-запрос, получили ответ" с виду работают лучше чем протоколы с постоянно висящими TCP-коннектами (несмотря на то что, в HTTP вроде есть опция "использовать TCP-соединение повторно", тоже вроде называющаяся keep-alive, чтобы все запутались).

В связи с этим интересно - а вот как к подобной боли с TCP соединениями относятся протоколы типа AMQP или веб-сокетов, которые тоже вроде бы должны висеть постоянно подключенными, т.к. в них сервер дергает клиента событиями?
В amqp есть фреймы типа heartbeat, выполняющие функцию аналогичную keep-alive на уровне TCP протокола, т.е. мало нам параметров сокетов или реестра, еще нужно будет с интервалами посылки этих фреймов разбираться. А что в веб-сокетах?

[identity profile] metaclass.livejournal.com 2014-05-14 08:42 am (UTC)(link)
Я не знаю, как этого добиваются авторы tcp-стеков или клиентских либ протокола - но ситуация "данные не идут" или "данные идут в никуда" встречается очень часто, помогает только подтверждение на уровне приложения, без вариантов.
Как диагностировать и что с этим делать для протоколов где нет подтверждений - пока не совсем ясно.

[identity profile] eternal-leave.livejournal.com 2014-05-14 10:44 am (UTC)(link)
Из виденного мной обычно косяки именно что в клиентских либах (классическое - "MySQL server has gone away" в libmysqlclient).
Наличие хартбитов на уровне протокола ИМХО оправдано только для крайне хреновых каналов связи, в которых часто физически падает линк. Подобные вещи, действительно, крайне сложно отследить на уровне клиента. Более мелкие косяки лечатся ретрансмитами.

[identity profile] nealar.livejournal.com 2014-05-14 10:45 am (UTC)(link)
Оч просто. Ситуация "ежи перегрызли кабель, никакой FIN не пришёл". Счастья добавляет сокетное API, которое детектит отвалившийся сокет только при попытке в него записать, а читать можно хоть до посинения. Потому и нужны пинги на уровне приложения.