На веб-сайте у меня есть очень простая настройка живого чата, которая использует SSE / Redis и структуру pub / sub.
Основная настройка c (без подробностей):
- На стороне клиента, используя
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 ДО подписки на канал? Например, "высовывать" необработанные сообщения или что-то в этом роде