我有一个实时传感应用程序,多个客户端,一个处理服务器。
我有一个问题,即我使用Socket.IO和NodeJS尽快将数据推送到客户端。问题似乎是从服务器上的发送器发送的客户端传入数据开始堆叠,客户端落后(不同步)。
有足够的吞吐量,客户保持良好状态。有没有什么办法可以强制执行一项政策,即服务器/客户端会丢弃任何超过指定时间段的发布?
数据被丢弃,客户端应该保持最新状态,所以我不担心丢失超过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 轮询传输,处于请求/响应周期的中间。
因此,如果您的客户端错过了几条消息,那么无关紧要 您可能希望将这些事件作为易失性消息发送。