我向服务器发送一个请求,服务器启动创建文件,然后客户端收到响应并继续创建文件。然后使用 websocket 向客户端发送有关进度的消息。我尝试在创建每个文件后发送一条消息。客户端收到第一条消息,但在创建其他文件时却收不到消息。这是因为消息数量多吗?
我想不是为每个文件发送消息,而是为每个第 10 个或第 20 个文件发送消息,或者在那里进行延迟。所以想请教技术高手的同事如何正确做?
您是对的,快速连续发送过多的 Websocket 消息有时会使客户端不堪重负。有几种方法可以解决这个问题:
let batch = [];
files.forEach(file => {
// add file to batch
batch.push(file);
// check if ready to send
if(batch.length >= 10 || Date.now() - lastUpdate > 2000) {
websocket.send(JSON.stringify(batch));
batch = [];
lastUpdate = Date.now();
}
})
使用套接字确认 - 在发送下一个更新之前等待客户端确认。这可以防止套接字不堪重负,同时确保正确接收消息。
使用队列(如 Redis Pub/Sub)而不是直接的 Websocket 消息。这有助于平滑更新高峰。
总体而言,根据客户端能力限制消息的频率和大小有助于防止消息丢失。从更简单的批处理开始,然后根据需要使用队列或确认。
如果有任何部分需要更多说明,请告诉我!