我有一个实时传感应用程序、多个客户端、一个处理服务器。
我有一个问题,我使用 Socket.IO 和 NodeJS 尽可能快地将数据推送到客户端。问题似乎是从服务器上的发射器发送的客户端传入数据开始堆积并且客户端落后(不同步)。
有了足够的吞吐量,客户端就可以保持良好状态。有什么方法可以强制执行一项策略,服务器/客户端将丢弃任何早于指定时间段的发射?
数据被丢弃,客户端应该保持最新,所以我不担心丢失超过 2 秒的数据。
我有一个实时传感应用程序、多个客户端、一个处理服务器。
我有一个问题,我使用 Socket.IO 和 NodeJS 尽可能快地将数据推送到客户端。问题似乎是从服务器上的发射器发送的客户端传入数据开始堆积并且客户端落后(不同步)。
有了足够的吞吐量,客户端就可以保持良好状态。有什么方法可以强制执行一项策略,服务器/客户端将丢弃任何早于指定时间段的发射?
数据被丢弃,客户端应该保持最新,所以我不担心丢失超过 2 秒的数据。
为了帮助可能遇到此问题的其他人,我设计了一个锁定系统,以便服务器仅在套接字空闲时发布数据。
这意味着服务器仍然尽可能快地发布,它只是不会堆叠几个传出的数据请求。请注意,这仅在您的消息被丢弃并且您需要最新信息时才有效。这也意味着消息之间存在一些开销,因为客户端必须通知服务器它已准备好接收更多消息。
然而,这意味着我的应用程序保持最新并且不会因请求堆积而落后,如果您在本地运行一个浏览器并通过网络运行另一个浏览器,这在之前很明显。
服务器.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
客户端.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');
});
发送 volatile 消息,如果无法发送,则可以将其丢弃。Socket.IO 通常会跟踪客户端是否接收到消息,但对于易失性消息,此检查不会完成,并且 Socket.IO 进程可以继续,而不是等待:
socket.volatile.emit('event', data);
这是文档所述:
这在功能上基本上是“一劳永逸”,当客户端无法接收消息时,这些消息不会在内部缓冲,例如,如果客户端有网络问题或客户端使用轮询传输并且处于请求/响应周期的中间.
因此,如果您的客户错过了一些消息或事件并不重要,您可能希望将它们作为易失性消息发送。