SSE / Redis - как восстановить сообщения, отправленные, когда SSE переходит в автономный режим - PullRequest
0 голосов
/ 31 марта 2020

На веб-сайте у меня есть очень простая настройка живого чата, которая использует SSE / Redis и структуру pub / sub.

Основная настройка c (без подробностей):

  1. На стороне клиента, используя EventSource

Открывает соединение SSE и подписывается на прямые события, отправленные демоном SSE. Отправляет сообщения на конечную точку API

connect(hash, eventListener) {

    const url = `${url}?client=$hash=${hash}`;
    sseSource = new EventSource(url);

    sseSource.onopen = function(e) {
      reconnectFrequencySeconds = 1;
    }

    sseSource.onerror = err => {
      this.closeSSEStream();
      this.reconnectSSEStream(hash, eventListener);
    };
    sseSource.addEventListener('messages', event => {
      const messages = JSON.parse(event.data);
      eventListener(messages);
    });
  },
Конечная точка API

Сохраняет сообщение в базе данных и отправляет его на канал Redis.

Redis DB

Хранит и обслуживает сообщения.

Серверный демон SSE

Подписывает клиента на канал в БД Redis и пересылает сообщения подписчикам, используя поток SSE.

const subscriber = redis.createClient();
subscriber.select(config.redisDatabase);

subscriber.on('message', function (channel, message) {
    log(connectionId, 'Redis: new msg on channel: ' + channel, message);
    let event = {
        event: 'messages',
        data: message
    };
    currentClient.connection.write(event);
  });

Все это работает довольно красиво хорошо, однако, это один шаг в сторону от совершенства. Во время развертывания мы перезапускаем наших сотрудников (включая демон SSE), и пока он отключается, пользователи не получают LIVE-обновления. Он прекрасно подключается, но сообщения, отправленные во время простоя, теряются (так как демон начинает прослушивать сообщения только при повторном подключении).

Моя единственная идея для обходного пути заключается в использовании сверхпрочного решения, в котором собираются «потерянные» сообщения. с отдельной конечной точкой API при переподключении и отображением для пользователя.

Существует ли готовый способ получения сообщений, которые были сохранены в Redis ДО подписки на канал? Например, "высовывать" необработанные сообщения или что-то в этом роде

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...