Нужен ли периодический ping (heartbeat) на локальных соединениях?
Здравствуйте! Поиск не помог, если плохо искал - прошу не пинать )
Клиент-серверное приложение, на внешних соединениях (между клиентом и сервером), как и положено, реализовал периодический ping (heartbeat), чтобы соединение не рвалось промежуточными узлами по причине не активности.
Серверная часть реализована как несколько отдельных процессов, которые связаны локальными соединениями (127.0.0.1/localhost). Вопрос в том, нужен ли периодический ping на этих соединениях или нет? Т.е. отслеживает ли linux (конкретно ubuntu, если это имеет значение) локальные соединения и прерывает их по какому-нибудь timeout или т.п.?
Mininara, а это не важно - все равно, если важна постоянная связь, хартбит нужен - как минимум в случае если если сервер на локалхосте вылетит, зависнет или не сможет подняться после перезапуска по какой-либо причине.
mayton2019, обычное асинхронное TCP-соединение. Я тоже не знаю, поэтому и спрашиваю ) Знаю, например, что mysql рвет неактивные соединения, и внешние и локальные, но он делает это сам. Я же соединения разрывать/переподключать не собираюсь, при запуске соединились, при остановке сами разорвутся. Но если что-то в системе следит за соединениями и рвет их, то значит надо реализовать периодический ping и, на всякий случай, продумать и реализовать действия при их разрыве.
Mininara, я-бы предложил тебе во первых ничего не делать.
А во вторых понаблюдать что за проблема. Если у тебя
вычислительный кластер и его ноды периодически
падают то тебе нужен какой-то кластерный протокол.
И этот протокол должен быть отделет от работы приложения.
Грубо говоря приложение не должно заниматься cluster recovery.
Что там происходит с MySQL - это проблемы его. И мы не можем
брать его за образец или считать что так правильно.
Voland69, отслеживание процессов реализовано, в случае выявления проблем (умер один из процессов или т.п.) предусмотрена перезапуск всех. Если кто-то не запустится, не запустятся и другие. Почему спрашиваю, а не делаю "на всякий случай": реализация пинга между процессами - это задача не сложная и не требовательная к ресурсам, но это дополнительные таймеры, следовательно лишние переключения между процессами (если это, например, простенький VPS и доступно только 1-2 ядра), что само по себе плохо сказывается на производительности.
mayton2019, проблем нет ) По крайней мере на горизонте десятков минут. Но чтобы быть уверенным, если не поступит конкретного ответа, я так понимаю придется проводить эксперимент: запускать 2 процесса, устанавливать между ними соединение и оставлять на сутки, не передавая ничего по этому соединению.
mayton2019, отдельный процесс который запускает/останавливает остальные в нужном порядке, за тем, чтобы они все оставались запущенными. Если один из процессов вдруг вылетит с фатальной ошибкой или его что-то прибьет/прибить вручную, то прибиваются и остальные
и таким образом вообще ушел бы от вопроса сети и портов.
А мониторинг - прикладной hearbeat как я и предлагал. И hearbeat должен
быть частью технологического цикла самого приложения. Не какой-то отдельный
процесс а именно цикл обработки прикладных сообщений. Только так
ты сможешь детектировать падение или зависание приложения. Других
способов не существует.
Локальные соединения обычно рвутся либо при умирании приложения, либо если там оказваются забиты все буферы (например, случился deadlock в недрах кода и входящий в приложение трафик не разбирается). Всё это нормально обрабатывать просто на исключениях. И логгировать. В случае возникновения реальных проблем (частые повторы ситуации, потери важных данных итд) - разбираться более целенаправленно.
В общем, для локальных соединений пинг обычно не нужен. ОС как правило, не разрывает такие соединения из-за простоя. Если соединение работает стабильно, в вашем случае - можно обойтись без пинга.
Если у вас сложная система с множеством процессов, периодический пинг может быть полезен. Но в большинстве случаев это не критично.