首页 > 解决方案 > 使用服务器发送的事件增长和增长的数组如何处理

问题描述

我是新手server sent events
我浏览了许多教程并观看了许多有用的视频,但我仍然不明白“如何处理根据每个用户请求不断增长的数据”??。

我使用NodeJS所以我从这里开始..
如何在 Node.js 中使用服务器发送的事件来构建实时应用程序

以下示例取自上述链接..

// in the following function they push each fact to facts array in order to later send it to the client
// the FACTS array can grow and grow and ... ??

async function addFact(request, respsonse, next) {
  const newFact = request.body;
  facts.push(newFact);
  respsonse.json(newFact); 
  return sendFactToAll(newFact);
}


// this is optimal, only 1 fact is send.
function sendFactToAll(newFact) {
   clients.forEach(client => 
   client.response.write(`data:${JSON.stringify(newFact)}\n\n`))
}

// what about sending all facts
function sendFactsToAll(facts) {
   clients.forEach(client => 
   client.response.write(`data:${JSON.stringify(facts)}\n\n`))
}
  1. 何时清除 FACTS 数组?
  2. 如果清除数组,那些需要从该数组中获取数据的用户呢?

谢谢你!

标签: node.jsserver-sent-events

解决方案


如何处理根据每个用户请求不断增长的数据?

目前,该演示存储所有事实,并将它们作为客户端的启动历史记录全部发送出去。由于这是一个演示,因此他们没有详细说明如何扩展它以使其永远运行。

在一个真实的应用程序中,您可能希望为每个事实添加一个 id(或时间戳)。然后你可以last-event-id在重新连接时使用它,以获得他们错过的事实。

您还可能希望将事实存储在某种 SQL DB 中,并可能提供单独的 Web 服务来访问历史记录。客户端首先会根据需要请求尽可能多的历史记录,然后启动事件源请求。

顺便说一句,如果您想扩展,我会让这个历史请求服务成为一个单独的 Web 服务。对于事件源,缩放的限制因素是同时连接的数量,而对于存储历史,限制是磁盘空间。

另一种方法是只保留最近的 100 个左右的事实,而不用担心完整的历史记录。您可以通过 在执行推送之前先执行此操作(如果该语法不熟悉,请参阅addFact()https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice )facts = facts.slice(-99)


推荐阅读