在一个网站上,我有一个非常简单的实时聊天设置,它使用SSE/Redis和pub/sub结构。
基本设置(无需详细说明)为:
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”未处理的消息或类似的东西?
当您重新连接发送请求以检查您是否是带有上次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