我们以「文件下载」功能进行说明,一般情况下,大文件的下载,服务端压力比较大、处理时间也比较长,为了有更好的交互体验,我们可以使用异步处理,服务端处理完了之后主动通知 客户端,效果如下:
这个小弹窗就是服务端处理完了之后,通过 SSE连接主动推送到客户端。
我们来看看处理流程:
1)SSE 连接:
先建立 SSE 连接,确保服务端有主动推送消息的能力。
2)异步下载:
长耗时下载任务我们通过异步的方式处理,避免用户在下载页面长时间等待。
3)广播并推送:
下载完成后,我们需要将完成事件推送给客户端。需要注意的是,由于服务是集群部署、SSE 连接在节点本地 Map 维护,这就有可能导致当前客户端的 SSE连接所在节点 与 事件推送节点 是两个独立的节点。
因此,我们这里借助于 Redis 的发布/订阅能力,将消息广播出去,能匹配连接的节点负责将消息推送至客户端、其他节点直接丢弃即可。效果图如下:
能否做到精准投递?
答案也是可以的,我们可以这样来做:
- 借助 Redis 做中心存储,存储Map<用户,节点IP> 这样的映射关系。
- 在推送消息之前,先通过映射关系找到该用户的SSE连接所在节点
- 然后在通过 RPC调用 直接将消息投递到对应的服务节点,最后由该节点进行事件推送。
一般情况下,我们可以用「广播」这种简单粗暴的方式应对大部分场景,毕竟「精准投递」需要中心化的维护节点关系、应对节点变更等,处理起来稍显麻烦。具体视业务场景来做选择即可。
SSE 技术是一种轻量级的实时推送技术,具有支持跨域、使用简单、支持自动重连等特点,使得其在实时消息推送、股票交易等场景下广泛使用。
另外,SSE 相对于 WebSocket 更加轻量级,如果需求场景不需要交互式动作,那么 SSE 是一个不错的选择。
HTTP/2 协议-服务端主动推送消息
这篇文章介绍一下 HTTP/2 的服务端消息推送功能,它可以很大程度的提升客户的体验,它与之前介绍的 Websocket 消息推送有很大的不同,讨论一下 HTTP/2 协议中的 PUSH_PROMISE 服务端推送帧实现原理。
1.服务器推送的意义
提前将资源推送到浏览器
推送可以基于已发送的请求,例如客户端请求 html,服务端可以主动推送 js、css 文件
2.服务端推送的基本实现原理
推送资源必须对应一个请求
请求由服务端 PUSH_PROMISE 帧发
目录问题场景Server side event (SSE)简介在后端使用SSE功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入
在开发web项目时,有一个需求是:后端服务器要主动地、不断地推送消息给客户端网页。要实现该需