使用Socket.IO发送数据的频率如何?

我正在创build一个Web应用程序,需要从服务器向客户端发送less量数据(每个套接字3个整数值),我想查看使用Socket.IO更新客户端的频率是否最高。

我希望实现至less50个套接字连接,每秒发送20个更新 。 理想的数字是每秒发送50次更新的200个套接字连接。

问题:使用Socket.IO发送新数据的频率是否有限制?

注意:我认识到这也成为服务器 – 客户端连接的速度问题,所以关于连接速度有多快我需要的任何信息,赞赏。 我计算,如果每个发送的数据包大约是500字节,那么我将能够在1 MB / s连接上每秒发送20个更新到100个连接。

这是一个非常系统,networking和代码相关的问题。

这里是一个小的testing工具,我曾经使用过类似的socket.iotesting,我已经插入一些适合你的问题。

服务器

const io = require('socket.io')(8082) const connections = [] io.on('connection', function(socket){ connections.push(socket); const slog = (msg, ...args) => console.log('%s %s '+msg, Date.now(), socket.id, ...args) slog('Client connected. Total: %s', connections.length) socket.on('disconnect', function(data){ connections.splice(connections.indexOf(socket), 1); slog('Client disconnected. Total: %s', connections.length) }) socket.on('single', function(data){ socket.emit('single',[ 0, now, now, now ]) }) socket.on('start', function(data = {}){ slog('Start stream', data) sendBatch(1, data.count, data.delay) }) socket.on('start dump', function(data = {}){ slog('Start dump', data) sendBatch(1, data.count) }) function sendBatch(i, max, delay){ if ( i > max ) return slog('Done batch %s %s', max, delay) socket.emit('batch',[ i, now, now, now ]) if (delay) { setTimeout(()=> sendBatch(i++, max, delay), delay) } else { setImmediate(()=> sendBatch(i++, max)) } } }) 

客户

 const io = require('socket.io-client') const socket = io('http://localhost:8082', {transports: ['websocket']}) socket.on('connect_error', err => console.error('Socket connect error:', err)) socket.on('connect_timeout', err => console.error('Socket connect timeout:', err)) socket.on('reconnect', err => console.error('Socket reconnect:', err)) socket.on('reconnect_attempt', err => console.error('Socket reconnect attempt:', err)) socket.on('reconnecting', err => console.error('Socket reconnecting', err)) socket.on('reconnect_error', err => console.error('Socket reconnect error:', err)) socket.on('reconnect_failed', err => console.error('Socket reconnect failed:', err)) function batch(n){ socket.on('batch', function(data){ if ( data[0] >= n ) { let end = Date.now() let persec = n / (( end - start ) / 1000) console.log('Took %s ms for %s at %s/s', end - start, n, persec.toFixed(1)) return socket.close() } }) } function startDump(count = 500000){ socket.emit('start dump', { count: count }) console.log('Start dump', count) batch(count) } function startStream(count = 50, delay = 1000){ socket.emit('start', { count: count, delay: delay }) console.log('Start stream', count, delay) batch(count) } function pingIt(i, max = 50){ socket.on('single', function(data){ console.log('Got a single with:', data) if (i >= max) { let end = Date.now() let persec = i / (end - start) * 1000 console.log('Took %s ms %s/s', end - start, persec.toFixed(2)) return socket.close() } socket.emit('single', i+=1) }) socket.emit('single', i) } let start = Date.now() //console.log('args command: %s count: %s delay: %s',process.argv[2], process.argv[3], process.argv[4]) switch(process.argv[2]){ case 'ping': pingIt(0, process.argv[3]); break case 'stream': startStream(process.argv[3], process.argv[4]); break case 'dump': startDump(process.argv[3]); break default: console.log('ping stream dump'); socket.close() } 

testing请求/响应往返

  node socketio-client.js ping 4 

要testing吞吐量,请尽可能快地转储消息。

  node socketio-client.js dump 100000 

testing1000条信息stream,每条信息每秒大约50条消息,间隔18毫秒。

  node socketio-client.js stream 1000 18 

在我的开发机器上,我可以每秒将大约40000条消息转储到一个具有4个整数作为2 GHz CPU上的有效载荷(计数器+3个时间戳)的本地主机客户端。 服务器和客户端node进程都使用95-100%的CPU核心。 所以纯粹的吞吐量看起来不错

我可以在服务器进程的CPU使用率为55%的情况下,每秒向100个本地客户端发送100条消息。

我不能从我的开发机器上的单个node进程中获得每秒超过130-140条消息给100个客户端。

新的高频英特尔Skylake CPU服务器可能会在本地拆除这些数字。 添加一个,可能flakey,networking连接,它会把它马上回落。 除了本地networking延迟以外的任何事情都可能会混淆你认为你将获得如此高的消息率。 对任何速度较慢的延迟抖动都会严重影响客户端消息的“帧速率”。 时间戳邮件和跟踪他们在客户端可能会被要求。

如果遇到问题,还有一些较低级别的websocket库,比如ws ,这将需要更多的实现,但是会给你更多的socket连接控制权,你也许可以从中获得更多的性能。

你有更多的连接,你会得到更多的争夺,你的代码和套接字代码的其余部分。 您可能最终需要使用多个节点来保持事情的顺利。 群集可以跨多个Node.js进程分割应用程序 。 您可能需要像Redis, ZeroMQ或Nanomsg来pipe理IPC。 节点9中的V8支持SharedArrayBuffer和Atomics,但是没有太多的东西落在了Node中,还没有和worker一起使用。

使用Socket.IO发送数据的频率如何?

使用Socket.IO发送新数据的频率是否有限制?

没有编码限制。 这将仅取决于您在两端处理消息的能力以及传送它们的带宽。 如果你真的想知道自己的硬件,networking和操作系统的限制,你必须devise一个testing,发送具有代表性的大小的快速火包,并看看你可以在一秒钟内发送多less所有到达目的地,任何一端都不会出现任何错误。

理想的数字是每秒发送50次更新的200个套接字连接。

您的服务器将需要能够每秒发送10,000条消息,每个客户端将需要能够每秒处理50条消息。 这在理论上可以通过正确的硬件和正确的networking连接来实现。

但是,每秒钟更新50次听起来可能是不必要的,效率也不高。 没有terminal用户每20ms就会感觉到一些变化,这是每秒50次更新的结果。 所以,将每个客户端的更新批量转换为每秒10次更新可能会更有效率。

我计算,如果每个发送的数据包大约是500字节,那么我将能够在1 MB / s连接上每秒发送20个更新到100个连接。

这种types的计算只适用于发送大块数据。 对于大量的小消息来说,有很多的低效率,因为TCP数据包的开销和大量小消息的webSocket / socket.io开销开始成为整个带宽消耗的一个可测量的百分比,并且由于TCP是可靠的协议,还确认来回确认递送。 如果数据包很小,则可能没有整体带宽问题,但是处理大量小数据包的问题将更多,并且会有这样的开销。

如果您可以将更新每秒更新到更less数量的更新,您将获得更好的可伸缩性。