何时使用服务器推送事件(Server-sent Events)来传递数据

3

我希望在数据库添加新记录时能够流式传输数据。现在,我为每个已连接的用户每10秒查询一次新记录。是否有更好的方法来实现这一点?我觉得应该在插入新记录后引发事件,并以某种方式访问相关用户的请求并为用户进行数据流。

(为了明确重点,我简化了我的代码。因此,可能不完全有效。)

router.get("/event",  (req, res, next) => {
  let userId = getUserIdFromRequest(req);
  getData(userId, (err, data) => {
    let stream = res.push("/notification/new");
    stream.end(JSON.stringify(data));
    res.write("data:/notification/new\n\n");
    res.flush();
  });
});

getData(userId, callback) {
 model.find( {where: { and: [{ "userId": userId }, { "notified": false }] }}, (err, data =>) {
   callback(null , data);
   setTimeout(function () { getData(callback); }, 10000);
   if (data) {
     setDataAsNotified(data); // makes notified: true
   } 
 })
}

前端:

let source = new EventSource("/route/notification/event")
source.onmessage = (event) => {
 // display notification
}

你解决了你的问题吗? - andylib93
1个回答

0
  • 前端/后端链接:您可以使用WebSockets。这样数据通过TCP传输而不是HTTP(更快,使用更少的资源)
  • 数据库查询:由于您没有提供如何将数据输入到基础中,因此这里有两个线索:

    如果您可以修改插入数据的代码,则使其通过WebSockets(或通过HTTP,但WebSocket更快)将这些数据发送到后端,并更新记录的数据库(或新连接的用户)

    如果您不能,则在此处提供链接:如何监听MongoDB集合的更改?

希望这可以帮助到您


第一个要点是不正确的:SSE和WebSockets将同样快(这只是TCP/IP数据包)。 (此外,OP并没有要求更快的替代SSE,而是要求何时/如何减少上行延迟。) - Darren Cook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接