Javascript SSE/Redis-如何恢复SSE脱机时发送的消息

Javascript SSE/Redis-如何恢复SSE脱机时发送的消息,javascript,redis,server-sent-events,eventsource,Javascript,Redis,Server Sent Events,Eventsource,在一个网站上,我有一个非常简单的实时聊天设置,使用SSE/Redis和pub/sub结构 基本设置(无需详细说明)为: 客户端使用EventSource 打开SSE连接并订阅SSE守护进程发送的实时事件。将消息发送到API端点 connect(hash, eventListener) { const url = `${url}?client=$hash=${hash}`; sseSource = new EventSource(url); sseSource.onop

在一个网站上,我有一个非常简单的实时聊天设置,使用SSE/Redis和pub/sub结构

基本设置(无需详细说明)为:

  • 客户端使用
    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数据库
  • 它保存并提供信息

  • 服务器端SSE守护进程
  • 将客户端订阅到Redis DB中的通道,并使用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守护进程),当它脱机时,用户不会收到实时更新。它可以很好地重新连接,但在停机期间发送的消息会丢失(因为守护进程仅在重新连接时才开始侦听消息)

    我唯一想到的解决方案是一个过度工程化的解决方案,其中“丢失”的消息在重新连接时通过单独的API端点收集并显示给用户

    在订阅频道之前,是否有现成的方式接收已存储到Redis的消息?例如“pop”未处理的消息或类似的东西