如何存储SSE连接?

时间:2019-04-05 19:52:34

标签: node.js api http server server-sent-events

我正在Firebase中设置一个Node.js Express服务器。我有一个仪表板页面。用户可以随时使用Chrome扩展程序将项目保存到其仪表板上。我希望他们新保存的项目定期出现在仪表板上。

繁忙的轮询似乎很容易运行

setInterval( () => {
   // async call to api with paging cursor

但这似乎浪费资源。

我阅读了有关服务器端事件的信息,并尝试通过代码实现它们。我见过的所有SSE示例看起来都是这样的:

var clients = {}; // <- Keep a map of attached clients

app.get('/events/', function (req, res) {
    req.socket.setTimeout(Number.MAX_VALUE);
    res.writeHead(200, {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive'
    });
    res.write('\n');
    (function (clientId) {
    clients[clientId] = res;
    req.on("close", function () {
      delete clients[clientId]
    }); 
    })(++clientId)
});

setInterval(function () {
    var msg = Math.random();
    console.log("Clients: " + Object.keys(clients) + " <- " + msg);
    for (clientId in clients) {
        clients[clientId].write("data: " + msg + "\n\n"); // <- Push a message to a single attached client
    };
}, 2000);

让SSE事件正常工作在测试示例中没有问题,并且适用于我的用例。

但是,我的担忧:

  1. 每个快速响应都存储在内存中。 10万用户的内存很大
  2. API POST方法需要访问客户端/响应。响应对象不容易存储在数据库中。
  3. 理想情况下,每个请求都使用标头auth承载令牌进行认证。浏览器EventSource似乎确实可以做到这一点

企业级应用实际上如何实施有效的SSE?

0 个答案:

没有答案