我正计划将websocket用于流式传输应用程序,但注意到消息传递方面存在一些小的不一致之处。我编写了以下两个文件来演示该问题(注意,该文件需要在单独的计算机上运行才能重现该问题):
// 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服务器以及家庭WiFi网络上运行服务器文件时,就会发生此问题。
是否存在可以更改的标志或设置,以确保尽快传递每条消息并避免不必要的分组? (我也尝试在ruby和python中实现server.js
逻辑,但是存在相同的问题。两台计算机在测试期间都安装了最新的nodejs(v10)和websocket(v6)库。)