将 websocket 与 Node.js 一起使用

问题描述 投票:0回答:1

我向服务器发送一个请求,服务器启动创建文件,然后客户端收到响应并继续创建文件。然后使用 websocket 向客户端发送有关进度的消息。我尝试在创建每个文件后发送一条消息。客户端收到第一条消息,但在创建其他文件时却收不到消息。这是因为消息数量多吗?

我想不是为每个文件发送消息,而是为每个第 10 个或第 20 个文件发送消息,或者在那里进行延迟。所以想请教技术高手的同事如何正确做?

javascript node.js websocket
1个回答
0
投票

您是对的,快速连续发送过多的 Websocket 消息有时会使客户端不堪重负。有几种方法可以解决这个问题:

  1. 将消息批量分成更少的更新:不要为每个文件发送一条消息,而是收集它们并发送批量更新(例如每 10 个文件或每 2 秒)。
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(); 
  }
})
  1. 使用套接字确认 - 在发送下一个更新之前等待客户端确认。这可以防止套接字不堪重负,同时确保正确接收消息。

  2. 使用队列(如 Redis Pub/Sub)而不是直接的 Websocket 消息。这有助于平滑更新高峰。

总体而言,根据客户端能力限制消息的频率和大小有助于防止消息丢失。从更简单的批处理开始,然后根据需要使用队列或确认。

如果有任何部分需要更多说明,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.