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