Я использую socket.io для отправки пакетов через websockets. Кажется, они время от времени исчезают. Поэтому я должен реализовать какую-то систему подтверждения. Моя идея заключалась в немедленном ответе на пакет с ACK-пакетом. Если сервер не получит этот ACK-пакет в течение заданного времени, он повторно отправит его (до 3 раз, затем отключит сокет).NodeJs: Как обрабатывать очень большое количество таймеров?
Моя первая мысль состояла в том, чтобы запустить таймер (setTimeout) после отправки пакета. если происходит время-событие, пакет должен быть отправлен снова. Если ACK придет, тайм-аут будет удален. Довольно легко и коротко.
var io = require('socket.io').listen(80);
// ... connection handling ...
function sendData(someData, socket) {
// TODO: Some kind of counter to stop after 3 tries.
socket.emit("someEvent", someData);
var timeout = setTimeout(function(){ sendData(someData, socket); }, 2000);
socket.on("ack", function(){
// Everything went ok.
clearTimeout(timeout);
});
}
Но у меня будут клиенты 1k-3k, связанные с большим количеством трафика. Я не могу себе представить, что 10k таймеров, работающих в то же время, можно выполнить с помощью NodeJS. Еще хуже: Я читал, что NodeJS не будет запускать событие, если на это нет времени.
Как реализовать хорошую рабочую и эффективную систему подтверждения пакетов?
Michael Мне интересно, если вы нашли решение этой проблемы? У меня есть аналогичная проблема здесь http://stackoverflow.com/questions/37234481/handling-timers-for-many-users-in-nodejs –
Действительно у меня есть. Избавьтесь от socket.io - у него много проблем, которые уже не решены. Сейчас я использую sockjs для всех своих проектов - более стабильным, но менее удобным. – Michael