node.js - 使用服务器发送的事件增长和增长的数组如何处理
问题描述
我是新手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`))
}
- 何时清除 FACTS 数组?
- 如果清除数组,那些需要从该数组中获取数据的用户呢?
谢谢你!
解决方案
如何处理根据每个用户请求不断增长的数据?
目前,该演示存储所有事实,并将它们作为客户端的启动历史记录全部发送出去。由于这是一个演示,因此他们没有详细说明如何扩展它以使其永远运行。
在一个真实的应用程序中,您可能希望为每个事实添加一个 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)
推荐阅读
- firebase - IllegalArgumentException:不支持的值:使用 twitter 登录时为 null
- c++ - 在 C++ 中访问虚拟类
- css - 如何缩放方形 CSS 网格以尊重父级宽度和高度
- python - Python中JSON的选择性展平
- powershell - PowerShell 脚本来配置没有密码用户的 Windows 服务
- java - 使用 Spring Cloud 优雅地关闭/停止 RabbitMQ 消费者
- django - 升级到最新版本后,默认 Django Rest Framework HTML POST 表单不显示
- solr - 通过 SOLR 使用 Tesseract 支持 OCR
- r - 由于 rstan 编译问题,travis 构建失败
- spring-boot - 詹金斯没有为spring boot 2.2.2.Release下载父POM