Задержанные сгруппированные сообщения WebSocket - PullRequest
0 голосов
/ 17 сентября 2018

Я планирую использовать веб-сокеты для потокового приложения, но заметил небольшое несоответствие в доставке сообщений.Я написал следующие два файла, чтобы продемонстрировать проблему (ПРИМЕЧАНИЕ: файлы должны быть запущены на разных компьютерах, чтобы воспроизвести проблему):

// server.js

var WebSocket = require('ws');

var wss = new WebSocket.Server({ port: 8082, perMessageDeflate: false });
wss.on('connection', function(socket, req) {
    socket.on('message', function(code, message){
        console.log('client send message');
    });
    socket.on('close', function(code, message){
        console.log('client disconnected');
    });
});

function intervalFunc() {
  wss.clients.forEach(function each(client) {
        if (client.readyState === WebSocket.OPEN) {
      client.send( process.memoryUsage()["heapUsed"] );
        }
    });
}

setInterval(intervalFunc, 50);

и

// client.js

const WebSocket = require('ws');

const ws = new WebSocket('ws://192.168.1.104:8082');

var i = 0;
var t = Date.now();

ws.on('open', function open() {
  console.log('connection established');
});

ws.on('message', function incoming(data) {
  console.log(i, data, Date.now(), Date.now() - t);
  t = Date.now()
  i = i + 1;
});

, первый файлпростой сервер WebSocket, который отправляет небольшое сообщение каждые 50 миллисекунд подключенным клиентам.Второй файл подключается к серверу и непрерывно печатает серверные сообщения, а также некоторые показатели, включая время между каждым сообщением.

В идеале время между каждым сообщением должно составлять около 50 миллисекунд.Однако, когда я просматриваю журналы, я вижу, что примерно через 10-15 секунд время доставки сообщений становится несогласованным, что приводит к нежелательным задержкам:

# message id, server used heap size, timestamp, time since last message
0 '6025408' 1537161387820 49
1 '6027080' 1537161387869 49
2 '6028752' 1537161387920 51
3 '6030424' 1537161387970 50
4 '6032096' 1537161388019 49
... 
it goes on like this for next 10-12 seconds
...
229 '6338152' 1537161397197 50
230 '6339824' 1537161397247 50
231 '6341496' 1537161397474 227 <-- no message for 227 millisecond, looks like messages #231, #232, #233 and #234 messages got grouped and delivered together
232 '6343168' 1537161397474 0
233 '6344840' 1537161397474 0
234 '6346512' 1537161397474 0
235 '6348184' 1537161397499 24
236 '6349856' 1537161397576 77
237 '6351528' 1537161397771 195
238 '6353200' 1537161397772 0
239 '6354872' 1537161397772 0
240 '6356544' 1537161397772 0
241 '6358216' 1537161397799 27
242 '6359888' 1537161397867 68
243 '6361560' 1537161398065 198
244 '6363232' 1537161398067 2
245 '6364904' 1537161398067 0
246 '6366576' 1537161398067 0
247 '6368248' 1537161398103 36
...
it keeps grouping a lot of messages together until it finally stabilizes around message #312 below
...
300 '6456864' 1537161400853 0
301 '6458536' 1537161400854 0
302 '6460208' 1537161400860 6
303 '6461880' 1537161401013 152
304 '6463552' 1537161401013 0
305 '6465224' 1537161401014 0
306 '6466896' 1537161401147 133
307 '6468568' 1537161401147 0
308 '6470240' 1537161401165 17
309 '6471912' 1537161401323 158
310 '6473584' 1537161401324 0
311 '6475256' 1537161401324 0
312 '6476928' 1537161401357 33
313 '6478600' 1537161401407 50 <-- back to normal
314 '6480272' 1537161401457 50
315 '6481944' 1537161401508 51
...
same issue happens every 10-15 seconds
...

Когда я запускаю оба сценария на одном компьютере, нетзапаздывает и проблема уходит.Но я замечаю значительные задержки при запуске скриптов на разных машинах.Эта проблема возникает, когда я запускаю файл сервера на сервере EC2, а также в моей домашней сети Wi-Fi.

Есть ли флаг или параметр, который я могу изменить, чтобы обеспечить максимально быструю доставку каждого сообщенияи избежать ненужной группировки?(Я также пытался реализовать логику server.js в ruby ​​и python, но у меня была одна и та же проблема. На обоих компьютерах были установлены новейшие библиотеки nodejs (v10) и websocket (v6) во время тестирования.)

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