Проверяет понимание проблем, возникающих при длительном использовании TCP-соединений, и способов их решения.
Долгоживущие TCP-соединения полезны для снижения накладных расходов на установку соединения, но они несут несколько рисков. Главный из них — утечка ресурсов: каждое соединение занимает файловый дескриптор, память в ядре и, возможно, порт. Если клиенты не закрывают соединения корректно, сервер может исчерпать лимиты и перестать принимать новые подключения.
Второй риск — half-open соединения. Это ситуация, когда одна сторона (например, клиент) неожиданно отключается (обрыв сети, сбой), а другая сторона не узнает об этом, пока не попытается отправить данные. TCP не имеет встроенного механизма обнаружения таких обрывов, поэтому сервер может держать мёртвое соединение часами.
const net = require('net');
const server = net.createServer((socket) => {
socket.setKeepAlive(true, 10000); // включаем keep-alive, интервал 10 сек
socket.setTimeout(30000); // таймаут бездействия 30 сек
socket.on('timeout', () => socket.destroy());
});
server.listen(8080);В этом примере сервер проверяет соединение каждые 10 секунд и закрывает его, если нет активности 30 секунд. Это предотвращает накопление мёртвых соединений.
Долгоживущие TCP-соединения стоит применять, когда важна низкая задержка и частые обмены данными, но обязательно нужно настроить keep-alive, таймауты и мониторинг ресурсов, чтобы избежать исчерпания лимитов и half-open проблем.