共计 6093 个字符,预计需要花费 16 分钟才能阅读完成。
本文由爱奇艺技术团队原创分享,原题《构建通用 WebSocket 推送网关的设计与实际》,有优化和改变。
1、引言
丛所周之,HTTP 协定是一种无状态、基于 TCP 的申请 / 响应模式的协定,即申请只能由客户端发动、由服务端进行响应。在大多数场景,这种申请 / 响应的 Pull 模式能够满足需要。但在某些情景:例如音讯推送(IM 中最为常见,比方 IM 的离线音讯推送)、实时告诉等利用场景,须要实时将数据同步到客户端,这就要求服务端反对被动 Push 数据的能力。
传统的 Web 服务端推送技术历史悠久,经验了短轮询、长轮询等阶段的倒退(见《新手入门贴:史上最全 Web 端即时通讯技术原理详解》),肯定水平上可能解决问题,但也存在着有余,例如时效性、资源节约等。HTML5 规范带来的 WebSocket 标准根本完结了这一场面,成为目前服务端音讯推送技术的支流计划。
在零碎中集成 WebSocket 非常简略,相干探讨与材料很丰盛。但如何实现一个通用的 WebSocket 推送网关尚未有成熟的计划。目前的云服务厂商次要关注 iOS 和安卓等挪动端推送,也短少对 WebSocket 的反对。本文分享了爱奇艺基于 Netty 实现 WebSocket 长连贯实时推送网关时的实际经验总结。
学习交换:
即时通讯 / 推送技术开发交换 5 群:215477170 [举荐]
挪动端 IM 开发入门文章:《新手入门一篇就够:从零开发挪动端 IM》
开源 IM 框架源码:https://github.com/JackJiang2…
(本文同步公布于:http://www.52im.net/thread-35…
2、专题目录
本文是系列文章的第 4 篇,总目录如下:
《长连贯网关技术专题(一):京东京麦的生产级 TCP 网关技术实际总结》
《长连贯网关技术专题(二):知乎千万级并发的高性能长连贯网关技术实际》
《长连贯网关技术专题(三):手淘亿级挪动端接入层网关的技术演进之路》
《长连贯网关技术专题(四):爱奇艺 WebSocket 实时推送网关技术实际》(* 本文)
其它相干技术文章:
《相对干货:基于 Netty 实现海量接入的推送服务技术要点》
《京东到家基于 Netty 的 WebSocket 利用实际分享》
爱奇艺技术团队分享的其它文章:
《爱奇艺技术分享:轻松滑稽,解说视频编解码技术的过来、当初和未来》
《爱奇艺技术分享:爱奇艺 Android 客户端启动速度优化实际总结》
《爱奇艺挪动端网络优化实际分享:网络申请成功率优化篇》
3、旧计划存在的技术痛点
爱奇艺号是咱们内容生态的重要组成,作为前台零碎,对用户体验有较高要求,间接影响着创作者的创作激情。
目前,爱奇艺号多个业务场景中用到了 WebSocket 实时推送技术,包含:
- 1)用户评论:实时的将评论音讯推送到浏览器;
- 2)实名认证:合同签订前须要对用户进行实名认证,用户扫描二维码后进入第三方的认证页面,认证实现后异步告诉浏览器认证的状态;
- 3)活体辨认:相似实名认证,当活体辨认实现后,异步将后果告诉浏览器。
在理论的业务开发中,咱们发现,WebSocket 实时推送技术在应用中存在一些问题。
这些问题是:
- 1)首先:WebSocket 技术栈不对立,既有基于 Netty 实现的,也有基于 Web 容器实现的,给开发和保护带来艰难;
- 2)其次:WebSocket 实现扩散在在各个工程中,与业务零碎强耦合,如果有其余业务须要集成 WebSocket,面临着反复开发的困境,节约老本、效率低下;
- 3)第三:WebSocket 是有状态协定的,客户端连贯服务器时只和集群中一个节点连贯,数据传输过程中也只与这一节点通信。WebSocket 集群须要解决会话共享的问题。如果只采纳单节点部署,尽管能够防止这一问题,但无奈程度扩大撑持更高负载,有单点的危险;
- 4)最初:不足监控与报警,尽管能够通过 Linux 的 Socket 连接数大抵评估 WebSocket 长连接数,但数字并不精确,也无奈得悉用户数等具备业务含意的指标数据;无奈与现有的微服务监控整合,实现对立监控和报警。
PS:限于篇幅本文不具体介绍 WebSocket 技术自身,有趣味能够详读《WebSocket 从入门到精通,半小时就够!》。
4、新计划的技术指标
如上节所示,为了解决旧计划中存在的问题,咱们须要实现对立的 WebSocket 长连贯实时推送网关。
这套新的网关须要具备如下特点:
- 1)集中实现长连贯治理和推送能力:对立技术栈,将长连贯作为根底能力积淀,便于性能迭代和降级保护;
- 2)与业务解耦:将业务逻辑与长连贯通信拆散,使业务零碎不再关怀通信细节,也防止了反复开发,节约研发老本;
- 3)应用简略:提供 HTTP 推送通道,不便各种开发语言的接入。业务零碎只须要简略的调用,就能够实现数据推送,晋升研发效率;
- 4)分布式架构:实现多节点的集群,反对程度扩大应答业务增长带来的挑战;节点宕机不影响服务整体可用性,保障高牢靠;
- 5)多端音讯同步:容许用户应用多个浏览器或标签页同时登陆在线,保障音讯同步发送;
6)多维度监控与报警:自定义监控指标与现有微服务监控零碎买通,呈现问题时可及时报警,保障服务的稳定性。
5、新计划的技术选型
在泛滥的 WebSocket 实现中,从性能、扩展性、社区反对等方面思考,最终抉择了 Netty。Netty 是一个高性能、事件驱动、异步非阻塞的网络通信框架,在许多出名的开源软件中被宽泛应用。
PS:如果你对 Netty 知之甚少,能够详读以下两篇:
- 《史上最艰深 Netty 入门长文:根本介绍、环境搭建、入手实战》
- 《新手入门:目前为止最透彻的的 Netty 高性能原理和框架架构解析》
WebSocket 是有状态的,无奈像间接 HTTP 以集群形式实现负载平衡,长连贯建设后即与服务端某个节点放弃着会话,因而集群下想要得悉会话属于哪个节点有点艰难。
解决以上问题个别有两种技术计划:
- 1)一种是应用相似微服务的注册核心来保护全局的会话映射关系;
- 2)一种是应用事件播送由各节点自行判断是否持有会话,两种计划比照如下表所示。
WebSocket 集群计划:
综合思考实现老本与集群规模,抉择了轻量级的事件播送计划。
实现播送能够抉择基于 RocketMQ 的音讯播送、基于 Redis 的 Publish/Subscribe、基于 ZooKeeper 的告诉等计划,其优缺点比照如下表所示。从吞吐量、实时性、长久化、实现难易等方面思考,最终抉择了 RocketMQ。
播送的实现计划比照:
6、新计划的实现思路
6.1 零碎架构
网关的整体架构如下图所示:
网关的整体流程如下:
1)客户端与网关任一节点握手建设起长连贯,节点将其退出到内存保护的长连贯队列。客户端定时向服务端发送心跳音讯,如果超过设定的工夫仍没有收到心跳,则认为客户端与服务端的长连贯已断开,服务端会敞开连贯,清理内存中的会话。
2)当业务零碎须要向客户端推送数据时,通过网关提供的 HTTP 接口将数据发向网关。
3)网关在接管到推送申请后,将音讯写入 RocketMQ。
4)网关作为消费者,以播送模式生产音讯,所有节点都会接管到音讯。
5)节点接管到音讯后判断推送的音讯指标是否在本人内存中保护的长连贯队列里,如果存在则通过长连贯推送数据,否则间接疏忽。
网关以多节点形式形成集群,每节点负责一部分长连贯,可实现负载平衡,当面对海量连贯时,也能够通过减少节点的形式分担压力,实现程度扩大。
同时,当节点呈现宕机时,客户端会尝试从新与其余节点握手建设长连贯,保障服务整体的可用性。
6.2 会话治理
WebSocket 长连贯建设起来后,会话保护在各节点的内存中。SessionManager 组件负责管理会话,外部应用了哈希表保护了 UID 与 UserSession 的关系。
UserSession 代表用户维度的会话,一个用户可能会同时建设多个长连贯,因而 UserSession 外部同样应用了一个哈希表保护 Channel 与 ChannelSession 的关系。
为了防止用户无限度的创立长连贯,UserSession 在外部的 ChannelSession 超过肯定数量后,会将最早建设的 ChannelSession 敞开,缩小服务器资源占用。SessionManager、UserSession、ChannelSession 的关系如下图所示。
SessionManager 组件:
6.3 监控与报警
为了理解集群建设了多少长连贯、蕴含了多少用户,网关提供了根本的监控与报警能力。
网关接入了 Micrometer,将连接数与用户数作为自定义指标裸露,供 Prometheus 进行采集,实现了与现有的微服务监控零碎买通。
在 Grafana 中不便地查看连接数、用户数、JVM、CPU、内存等指标数据,理解网关以后的服务能力与压力。报警规定也能够在 Grafana 中配置,当数据异样时触发奇信(外部报警平台)报警。
7、新计划的性能压测
压测筹备:
1)压测抉择两台配置为 4 核 16G 的虚拟机,别离作为服务器和客户端;
2)压测时抉择为网关凋谢了 20 个端口,同时建设 20 个客户端;
3)每个客户端应用一个服务端端口建设起 5 万连贯,能够同时创立百万个连贯。
连接数(百万级)与内存应用状况如下图所示:
给百万个长连贯同时发送一条音讯,采纳单线程发送,服务器发送实现的均匀耗时在 10s 左右,如下图所示。
服务器推送耗时:
个别同一用户同时建设的长连贯都在个位数。以 10 个长连贯为例,在并发数 600、持续时间 120s 条件下压测,推送接口的 TPS 大概在 1600+,如下图所示。
长连贯 10、并发 600、持续时间 120s 的压测数据:
以后的性能指标已满足咱们的理论业务场景,可反对将来的业务增长。
8、新计划的理论利用案例
为了更活泼的阐明优化成果,文章最初,咱们也以封面图增加滤镜成果为例,介绍一个爱奇艺号应用新 WebSocket 网关计划的案例。
爱奇艺号自媒体发表视频时,可抉择为封面图增加滤镜成果,疏导用户提供提供更优质的封面。
当用户抉择一个封面图后,会提交异步的后盾解决工作。当异步工作解决实现后,通过 WebSocket 将不同滤镜成果解决后的图片返回给浏览器,业务场景如下图所示。
从研发效率方面思考,如果在业务零碎中集成 WebSocket,至多须要 1 - 2 天的开发工夫。
如果间接应用新的 WebSocket 网关的推送能力,只须要简略的接口调用就实现了数据推送,开发工夫升高到分钟级别,研发效率大大提高。
从运维老本方面思考,业务零碎不再含有与业务逻辑无关的通信细节,代码的可维护性更强,零碎架构变得更加简略,运维老本大大降低。
9、写在最初
WebSocket 是目前实现服务端推送的支流技术,失当应用可能无效提供零碎响应能力,晋升用户体验。通过 WebSocket 长连贯网关能够疾速为零碎减少数据推送能力,无效缩小运维老本,进步开发效率。
长连贯网关的价值在于:
- 1)它封装了 WebSocket 通信细节,与业务零碎解耦,使得长连贯网关与业务零碎可独立优化迭代,防止反复开发,便于开发与保护;
- 2)网关提供了简略易用的 HTTP 推送通道,反对多种开发语言接入,便于系统集成和应用;
- 3)网关采纳了分布式架构,能够实现服务的程度扩容、负载平衡与高可用;
- 4)网关集成了监控与报警,当零碎异样时能及时预警,保障服务的衰弱和稳固。
目前,新的 WebSocket 长连贯实时网关已在爱奇艺号图片滤镜后果告诉、MCN 电子签章等多个业务场景中失去利用。
将来还有许多方面须要摸索,例如音讯的重发与 ACK、WebSocket 二进制数据的反对、多租户的反对等。
附录:更多相干技术材料
[1] 无关 WEB 端即时通讯开发:
《新手入门贴:史上最全 Web 端即时通讯技术原理详解》
《Web 端即时通讯技术盘点:短轮询、Comet、Websocket、SSE》
《SSE 技术详解:一种全新的 HTML5 服务器推送事件技术》
《Comet 技术详解:基于 HTTP 长连贯的 Web 端实时通信技术》
《老手疾速入门:WebSocket 扼要教程》
《WebSocket 详解(一):初步意识 WebSocket 技术》
《WebSocket 详解(二):技术原理、代码演示和利用案例》
《WebSocket 详解(三):深刻 WebSocket 通信协议细节》
《WebSocket 详解(四):刨根问底 HTTP 与 WebSocket 的关系(上篇)》
《WebSocket 详解(五):刨根问底 HTTP 与 WebSocket 的关系(下篇)》
《WebSocket 详解(六):刨根问底 WebSocket 与 Socket 的关系》
《socket.io 实现音讯推送的一点实际及思路》
《LinkedIn 的 Web 端即时通讯实际:实现单机几十万条长连贯》
《Web 端即时通讯技术的倒退与 WebSocket、Socket.io 的技术实际》
《Web 端即时通讯平安:跨站点 WebSocket 劫持破绽详解(含示例代码)》
《开源框架 Pomelo 实际:搭建 Web 端高性能分布式 IM 聊天服务器》
《应用 WebSocket 和 SSE 技术实现 Web 端音讯推送》
《详解 Web 端通信形式的演进:从 Ajax、JSONP 到 SSE、Websocket》
《MobileIMSDK-Web 的网络层框架为何应用的是 Socket.io 而不是 Netty?》
《实践联系实际:从零了解 WebSocket 的通信原理、协定格局、安全性》
《微信小程序中如何应用 WebSocket 实现长连贯(含残缺源码)》
《八问 WebSocket 协定:为你疾速解答 WebSocket 热门疑难》
《Web 端即时通讯实际干货:如何让你的 WebSocket 断网重连更疾速?》
《WebSocket 从入门到精通,半小时就够!》
《WebSocket 硬核入门:200 行代码,教你徒手撸一个 WebSocket 服务器》
更多同类文章 ……
[2] 无关推送技术的文章:
《一个基于 MQTT 通信协议的残缺 Android 推送 Demo》
《求教 android 音讯推送:GCM、XMPP、MQTT 三种计划的优劣》
《挪动端实时音讯推送技术浅析》
《相对干货:基于 Netty 实现海量接入的推送服务技术要点》
《极光推送零碎大规模高并发架构的技术实际分享》
《魅族 2500 万长连贯的实时音讯推送架构的技术实际分享》
《专访魅族架构师:海量长连贯的实时音讯推送零碎的心得体会》
《基于 WebSocket 实现 Hybrid 挪动利用的音讯推送实际(含代码示例)》
《一个基于长连贯的平安可扩大的订阅 / 推送服务实现思路》
《实际分享:如何构建一套高可用的挪动端音讯推送零碎?》
《Go 语言构建千万级在线的高并发音讯推送零碎实际(来自 360 公司)》
《腾讯信鸽技术分享:百亿级实时音讯推送的实战经验》
《百万在线的美拍直播弹幕零碎的实时推送技术实际之路》
《京东京麦商家开放平台的音讯推送架构演进之路》
《技术干货:从零开始,教你设计一个百万级的音讯推送零碎》
《长连贯网关技术专题(四):爱奇艺 WebSocket 实时推送网关技术实际》
更多同类文章 ……
本文已同步公布于“即时通讯技术圈”公众号。
▲ 本文在公众号上的链接是:点此进入。同步公布链接是:http://www.52im.net/thread-35…