删除数据包如果落后于Node JS中的Socket.IO

时间:2013-10-21 14:07:55

标签: javascript performance node.js websocket socket.io

我有一个实时传感应用程序,多个客户端,一个处理服务器。

我有一个问题,即我使用Socket.IO和NodeJS尽快将数据推送到客户端。问题似乎是从服务器上的发送器发送的客户端传入数据开始堆叠,客户端落后(不同步)。

有足够的吞吐量,客户保持良好状态。有没有什么办法可以强制执行一项政策,即服务器/客户端会丢弃任何超过指定时间段的发布?

数据被丢弃,客户端应该保持最新状态,所以我不担心丢失超过2秒的数据。

2 个答案:

答案 0 :(得分:2)

为了帮助可能遇到此问题的其他人,我设计了一个锁定系统,以便服务器只在套接字空闲时发布数据。

这意味着服务器仍然尽可能快地发布,它不会堆叠多个传出数据请求。请注意,这仅在您的消息丢失并且您需要最新信息时才有效。这也意味着消息之间会有一些开销,因为客户端必须通知服务器它已经准备好了更多。

然而,这意味着我的应用程序仍然是最新的,并且不会因堆叠请求而落后,如果您在本地运行一个浏览器而在网络上运行另一个浏览器,这一点很明显。

<强> Server.js

var socket = ...; // Create socket

// Create my data, in my project this updates very quickly
// roughly 60 times per second
var my_data = ...;

// Initially set receiving to false as the socket
// has no outgoing data
socket.set('receiving', false);

// Listen for received event, this indicates
// that the client has received an update
// and is now ready to receive more
socket.on('received', function() {
    socket.set('receiving', false);
});

// Function will be called repeatedly to send out data
function update() {
    // Check if the socket is receiving any data
    socket.get('receiving', function(receiving) {
        if(!receiving) {
            // Lock the socket from receiving future updates
            // by setting the receiving variable to true
            socket.set('receiving', true, function() {
                // Now emit data
                socket.emit('update', my_data);
            });
        }
    });

    setTimeout(update, 0); // Recursively call update
}
setTimeout(update, 0); // Start update

<强> Client.js

var socket = io.connect();

socket.on('update', function(data) {
    // Store the data for processing

    // Tell the server we have received the data
    socket.emit('received');
});

答案 1 :(得分:1)

发送易失性消息,如果无法发送,则可以将其删除。 Socket.IO通常会跟踪客户端是否收到了消息,但是对于易失性消息,这个检查没有完成,Socket.IO进程可以继续,而不是等待:

socket.volatile.emit('event', data);

这是文档所述的内容:

  

这基本上是火和忘记功能,这些消息不是   当客户端无法接收消息时,在内部缓冲   例如,如果客户端有网络问题或客户端使用a   轮询传输,处于请求/响应周期的中间。

     

因此,如果您的客户端错过了几条消息,那么无关紧要   您可能希望将这些事件作为易失性消息发送。