Я пишу утилиту для мониторинга сети, которая работает как приложение 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
.