当前位置: 首页 > 知识库问答 >
问题:

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

吕嘉赐
2023-03-14

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

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

  1. 客户端使用EventSource

打开SSE连接并订阅SSE守护程序发送的实时事件。将消息发送到APIendpoint

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);
    });
  },

将消息存储在数据库中并将其推送到Redis通道。

保存和服务信息。

将客户端订阅到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守护程序),当它离线时,用户不会收到实时更新。它重新连接很好,但在停机期间发送的消息会丢失(因为守护程序仅在重新连接时开始监听消息)。

我唯一的解决方法是采用一种过度工程化的解决方案,在重新连接时,使用单独的APIendpoint收集“丢失”的消息,并将其显示给用户

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

共有1个答案

车胤运
2023-03-14

当您重新连接发送请求以检查您是否是带有上次msg时间的新msg,如果您是较新的msg,请将其发送到结果msg以避免新请求

 类似资料:
  • 我想要实现的是: user1向服务器发送消息(一个简单的POST请求) 服务器部分是(events.php) 我在(true)时尝试了无限循环以避免3秒的轮询。我也尝试过没有那个无限循环。只有发送消息的用户收到事件。 我理解这种做法并不好。但是,将SSE用于聊天应用程序的最佳实践是什么? 如何向所有用户发送事件?

  • 我喜欢做一个有redis回应的SSE。在quarkus中订阅。 我有一个来自quarkus快速入门的简单SSE示例 这个效果很好,每2秒钟我就会收到Hello。。。。在我的web浏览器中 现在我尝试订阅Redis,所以我应该会收到Redis的消息。 Redis示例: 现在,我用quarkus SSE尝试以下方法: 我收到的是一个例外: 有人能支持我吗?有一个简单的例子吗?我对此一无所知,我无法接收

  • 如上所述,SSE 是一种技术,允许客户订阅服务器上产生的事件通知。服务器生成新的事件和将这些事件发送回订阅的客户端来接收通知。换句话说,SSE 为单向发布-订阅模式提供了一个解决方案。 一个很好的应用场景是,SSE 可以用于简单的 RESTful 服务的消息交换。客户端发送新消息到服务器,并从其他客户端订阅接收消息。我们称这种资源为 messages(信息)。在发布新消息到这个资源是一个典型的客户

  • 主要内容:Server-Sent 事件 - 单向消息传递,浏览器支持,接收 Server-Sent 事件通知,实例,检测 Server-Sent 事件支持,服务器端代码实例,实例,EventSource 对象HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新。 Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获取来自服务器的更新。 以前也可能做到这一点,前提是网页不得不询问是否有可用的更新。通过服务器发送事件,更

  • PHP SSE: Server-sent Events,一个简单有效的库,通过 PHP 实现了 HTML5 的服务器发送事件,用于实时从服务器推送事件到客户端,比 Websocket 更容易。 要求:PHP 5.4 or later 示例代码 Javascript demo Client: receiving events from the server //withCredentials=tru

  • Cyclone SSE 是一个 Server-Sent Events (EventSource) 广播服务器,基于 Cyclone Web 服务器构建。 安装: virtualenv --no-site-packages env. env/bin/activatepip install cyclone-sse 客户端使用: <!doctype html><meta charset=utf-8><t