Как хранить SSE соединения? - PullRequest
0 голосов
/ 05 апреля 2019

Я устанавливаю экспресс-сервер Nodejs в Firebase.У меня есть страница панели инструментов.Пользователь может сохранить элементы на своей панели в любое время, используя расширение 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. Каждый экспресс-ответ хранится в памяти.100 тыс. Пользователей - много памяти
  2. Методу API POST необходим доступ к клиентам / ответам.Объект ответа не может быть легко сохранен в БД.
  3. В идеале каждый запрос аутентифицируется токенами носителя аутентификации заголовка.Это кажется возможным с браузером EventSource

Как приложения уровня предприятия фактически реализуют эффективную SSE?

...