Node.js net .Socket TCP-соединения случайным образом занимают> 4K мс - PullRequest
1 голос
/ 04 марта 2020

Я пишу утилиту для мониторинга сети, которая работает как приложение Node.js в контейнере Linux, работающем в Kubernetes. Утилита использует Node's net .Socket для периодического (каждые 30 секунд) создания TCP-сокета с набором URI (например, https://random URI.org). После возврата из вызова метода connect() я измеряю, сколько времени понадобилось соединению для установления sh, регистрирую эту информацию, а затем закрываю сокет с помощью destroy().

Все работает нормально ( если для установки сокетов требуется около 30 мсек, sh), но иногда (~ раз в две минуты или около того) для установления сокета требуется> 4000 мс .

для удаления Node.js из рисунка я запустил nping на самом модуле Linux, к тому же URI и не увидел этого поведения (иногда я видел медленный пинг, но это было около 1000 мс).

Любая идея, если я делаю что-то не так, или это может быть просто проблема с net библиотекой Node?

const client: net.Socket = new net.Socket();
const stopwatch: Stopwatch = new Stopwatch();
stopwatch.start();

// Wrapping net.Socket.connect in a promise so that we can await
// until we have results from the TCP socket fired
await new Promise((resolve, reject) => {

    // Register event handlers
    client.on('connect', () => {
        tcpSuccess = true;
        tcpLatency = this.calculateLatencyAndCleanup(client, stopwatch);
        resolve();
    });

    client.on('error', (err) => {
        tcpLatency = this.calculateLatencyAndCleanup(client, stopwatch);
        reject('Socket error for: `' + hostString + ':' + tcpPort + '`');
    });

    client.on('timeout', () => {
        tcpLatency = this.calculateLatencyAndCleanup(client, stopwatch);
        reject('Socket timeout for: `' + hostString + '`');
    });

    // Attempt to create TCP socket
    client.connect(tcpPort, hostString);

PS вызов cl inet .destroy находится в методе calculateLatencyAndCleanup .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...