本文由爱奇艺技术团队原创分享,原题《构建通用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...