У нас есть простой TCP-сервер за сетевым ELB AWS (похожий на Echo-сервер с долгоживущими соединениями), написанный на Netty, и я пытаюсь реализовать механизм keep-alive, похожий на механизм keep-alive TCP, чтобы сохранить нашсвободные соединения открыты. К сожалению, мы не можем полагаться на механизм поддержания активности TCP, поскольку NELB не пересылают TCP-пакеты проверки активности на другую сторону loadbalancer.
Что я думаю сделать, это наблюдать за незанятыми соединениями и отправлять пустую строку (пустой байтовый массив) клиентам. То, что я до сих пор делал в коде:
- Добавление
IdleStateHandler
с некоторыми значениями времени ожидания - Регистрация
GprsKeepAliveHandler
, подкласс ChannelDuplexHandler
, переопределение userEventTriggered
метод отправки (ctx.writeAndFlush
) Unpooled.EMPTY_BUFFER
.
Таким образом, я ожидаю получить пакет RST, если соединение разорвано. В противном случае соединение снова станет активным.
Проблема в том, что Netty ничего не делает с пустым сообщением, не отправляет клиенту никаких пакетов (отслеживается с помощью Wireshark). Если я изменю сообщение на Unpooled.wrappedBuffer(new byte[]{0})
, я увижу то, что ожидаю увидеть.
Вопросы
- Я не смог найти лучшего способа достичь своей цели (сохраняйте связиживы и обнаруживают мертвые соединения). Если есть лучший способ, пожалуйста, дайте мне знать.
- Как правильно отправить пустое сообщение в Netty? (Я видел этот вопрос, но он не помог)
- Если проблема связана с поведением стека TCP в ОС, есть ли способ решить эту проблему?