100万级连接,爱奇艺WebSocket网关如何架构

说在前面

在40岁老架构师 尼恩的读者社区(50+)中,很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。

最近,尼恩指导一个小伙伴简历,写了一个《高并发网关项目》,此项目帮这个小伙拿到 字节/阿里/微博/汽车之家 面邀, 所以说,这是一个牛逼的项目。

为了帮助大家拿到更多面试机会,拿到更多大厂offer,

尼恩决定:9月份给大家出一章视频介绍这个项目的架构和实操,《33章:10Wqps 高并发 Netty网关架构与实操》,预计月底发布。然后,提供一对一的简历指导,这里简历金光闪闪、脱胎换骨。

《33章:10Wqps 高并发 Netty网关架构与实操》 海报如下:

配合《33章:10Wqps 高并发 Netty网关架构与实操》, 尼恩会梳理几个工业级、生产级网关案例,作为架构素材、设计的素材。

前面梳理了

  • 《日流量200亿,携程网关的架构设计》
  • 《千万级连接,知乎如何架构长连接网关?》
  • 《日200亿次调用,喜马拉雅网关的架构设计》

除了以上的三个案例,这里,尼恩又找到一个漂亮的生产级案例:

爱奇艺WebSocket实时推送网关技术实践》,

注意,这又一个非常 牛逼的工业级、生产级网关案例

这些案例,并不是尼恩的原创。这些案例,仅仅是尼恩在《33章:10Wqps 高并发 Netty网关架构与实操》备课的过程中,在互联网查找资料的时候,收集起来的,供大家学习和交流使用。

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到公号【技术自由圈】获取

文章目录

    • 说在前面
    • 100W级连接,爱奇艺WebSocket推送网关架构
    • 1、旧方案存在的技术痛点
    • 2、新方案的技术目标
    • 3、新方案的技术选型
    • 4、新方案的实现思路
      • 4.1 系统架构
      • 4.2 会话管理
      • 4.3 监控与报警
    • 5、新方案的性能压测
    • 6、新方案的实际应用案例
    • 7、总结
    • 说在最后:有问题可以找老架构取经
    • 推荐阅读

100W级连接,爱奇艺WebSocket推送网关架构

原文作者: 爱奇艺技术团队

HTTP 协议属于一种无状态、基于 TCP 的请求/响应模式的协议,

HTTP 协议中,只有客户端能发起请求,由服务端进行回应。

虽然,在许多情况下,这种请求/响应的拉取模式能够满足需求。

然而,在特定情况下,例如实时通知(如 IM 中的离线消息推送最为典型)和消息推送等应用场景,需要将数据实时推到客户端,这就要求服务端具备主动推送数据的能力。

如何推呢?

传统的 Web 服务端推送技术,包括短轮询、长轮询等,虽然能在一定程度上解决问题,但也存在如时效性、资源浪费等问题。

HTML5 标准推出的 WebSocket 规范基本改变了这种状况,已经成为当前服务端消息推送技术的主流。

本文将分享爱奇艺在基于 Netty 实现 WebSocket 长连接实时推送网关过程中的实践经验和总结。

1、旧方案存在的技术痛点

爱奇艺号作为我们内容生态的关键部分,作为前端系统,对用户体验有着较高的要求,这直接影响着创作者的创作热情。

当前,爱奇艺号在多个业务场景中应用了 WebSocket 实时推送技术,包括

1)用户评论:实时地将评论消息推送至浏览器;

2)实名认证:在合同签署前,需要对用户进行实名认证,用户扫描二维码后进入第三方的认证页面,认证完成后异步通知浏览器认证状态;

3)活体识别:类似于实名认证,当活体识别完成后,异步将结果通知浏览器。

在实际业务开发中,我们发现 WebSocket 实时推送技术在使用过程中存在一些问题。

这些问题是

1)首先:WebSocket 技术栈不统一,既有基于 Netty 实现的,也有基于 Web 容器实现的,给开发和维护带来困难;

2)其次:WebSocket 实现分散在各个工程中,与业务系统紧密耦合,如果有其他业务需要集成 WebSocket,将面临重复开发的困境,浪费成本、效率低下;

3)第三:WebSocket 是有状态协议,客户端连接服务器时只与集群中一个节点连接,数据传输过程中也只与这一节点通信。WebSocket 集群需要解决会话共享的问题。如果只采用单节点部署,虽然可以避免这一问题,但无法水平扩展以支持更高的负载,存在单点故障风险;

4)最后:最后:缺乏监控与报警,虽然可以通过 Linux 的 Socket 连接数大致评估 WebSocket 长连接数,但数字并不准确,也无法得知用户数等具有业务含义的指标数据;无法与现有的微服务监控整合,实现统一监控和报警。

2、新方案的技术目标

如上所述,为了解决旧方案中存在的问题,我们需要实现统一的 WebSocket 长连接实时推送网关。

这套新的网关需要具备以下特点

1)集中实现长连接管理和推送能力:采用统一的技术栈,将长连接作为基础功能进行沉淀,以便于功能的迭代和维护;

2)与业务解耦:将业务逻辑与长连接通信分离,使得业务系统无需关心通信细节,避免了重复开发,节约了研发成本;

3)使用简单:提供 HTTP 推送通道,便于各种开发语言的接入。业务系统只需进行简单的调用,便可实现数据推送,从而提高研发效率;

4)分布式架构:构建多节点的集群,支持水平扩展以应对业务增长带来的挑战;节点故障不会影响服务的整体可用性,确保高可靠性;

5)多端消息同步:允许用户使用多个浏览器或标签页同时登录在线,确保消息同步发送;

6)多维度监控与报警:将自定义监控指标与现有的微服务监控系统连接,当出现问题时可以及时报警,保证服务的稳定性。

3、新方案的技术选型

在众多的 WebSocket 实现中,经过对性能、扩展性、社区支持等各方面的权衡,我们最终确定了 Netty。

Netty 是一个高性能、事件驱动、异步非阻塞的网络通信框架,已在许多知名的开源项目中得到广泛应用。

WebSocket 具有状态特性,这与 HTTP 的无状态特性不同,因此无法像 HTTP 一样通过集群方式实现负载均衡。在长连接建立后,它会与服务端的某个节点保持会话,所以在集群环境下,要确定会话属于哪个节点会有些困难。

解决以上问题一般有两种技术方案

1)一种是使用类似于微服务注册中心的技术来维护全局的会话映射关系;

2)另一种是使用事件广播,由各节点自行判断是否持有会话。这两种方案的对比如下表所示。

WebSocket集群方案

方案优点缺点
注册中心会话映射关系清晰,集群规模较大时更合适实现复杂,强依赖注册中心,有额外运维成本
事件广播实现简单更加轻量节点较多时,所有节点均被广播,资源浪费

考虑到实现成本和集群规模,我们选择了轻量级的事件广播方案。

实现广播的方法有多种,如基于 RocketMQ 的消息广播、基于 Redis 的 Publish/Subscribe、基于 ZooKeeper 的通知等。

这些方案的优缺点对比如下表所示。在考虑到吞吐量、实时性、持久化和实现难易程度等因素后,我们最终选择了 RocketMQ。

广播的实现方案对比

方案优点缺点
基于RocketMQ吞吐量高、高可用、保证可靠实时性不如Redis
基于Redis实时性高、实现简单不保证可靠
基于ZooKeeper实现简单写入性能较差,不适合频繁写入场景

4、新方案的实现思路

4.1 系统架构

网关的整体架构如下图所示

注意:请点击图像以查看清晰的视图!

网关的整体流程如下

**1)**客户端与网关的任何一个节点建立长连接,节点会将其加入到内存中的长连接队列。客户端会定期向服务端发送心跳消息,若超过设定时间还未收到心跳,则认为客户端与服务端的长连接已断开,服务端会关闭连接,清理内存中的会话。

2)当业务系统需要向客户端推送数据时,通过网关提供的HTTP接口将数据发送至网关。

3)在收到推送请求后,网关会将消息写入RocketMQ

4)网关作为消费者,以广播模式消费消息,所有节点都能收到消息。

5)节点在收到消息后会判断推送的消息目标是否在其内存中维护的长连接队列里,如果存在则通过长连接推送数据,否则直接忽略。

网关通过多节点构成集群,每个节点负责一部分长连接,实现负载均衡。当面临大量连接时,也可以通过增加节点来分散压力,实现水平扩展。

同时,当节点出现故障时,客户端会尝试与其他节点重新建立长连接,确保服务的整体可用性。

4.2 会话管理

在 WebSocket 长连接建立后,会话信息会保存在各个节点的内存中。

SessionManager 组件负责管理会话,它内部使用哈希表来维护 UID 与 UserSession 的关联。

UserSession 表示用户层面的会话,一个用户可能同时拥有多个长连接,因此 UserSession 内部同样使用哈希表来维护 Channel 与 ChannelSession 的关联。

为了防止用户无休止地创建长连接,当 UserSession 内部的 ChannelSession 超过一定数量时,它会关闭最早建立的 ChannelSession,以减少服务器资源的占用。

SessionManager、UserSession、ChannelSession 的关系如下图所示。

SessionManager组件

注意:请点击图像以查看清晰的视图!

4.3 监控与报警

为了掌握集群中建立的长连接数量和包含的用户数量,网关提供了基本的监控和报警功能。

网关接入了Micrometer,将连接数和用户数作为自定义指标暴露,供Prometheus进行采集,从而实现了与现有的微服务监控系统打通。

在Grafana中,可以方便地查看连接数、用户数、JVM、CPU、内存等指标数据,了解网关当前的服务能力和压力。报警规则也可以在 Grafana 中配置,当数据异常时触发奇信(内部报警平台)报警。

5、新方案的性能压测

压测准备

  • 1)选择两台配置为 4 核 16G 的虚拟机,分别作为服务器和客户端;
  • 2)在压力测试时,为网关开放 20 个端口,同时启动 20 个客户端
  • 3)每个客户端使用一个服务器端口建立 5 万个连接,从而可以同时创建百万个连接。

连接数(百万级)与内存使用情况如下图所示

[root@sy-dev-1de4f0c2a target]# ss -s ; free -h
Total: 1002168 (kernel 1002250)
TCP: 1002047 (estab 1002015, closed 4, orphaned 0, synrecv 0, timewait 4/0), ports 0
Transport Total   IP      IPv6
*         1002250 -       -
RAW       0       0       0
UDP       4       2       2
TCP       1002043 1002041 2
INET      1002047 1002043 4
FRAG      0       0       0total   used    free  shared  buff/cache  available
Mem:      15G     4.5G    4.5G  232K    6.5G        8.2G
Swap:     4.0G    14M     4.0G

给百万个长连接同时发送一条消息,采用单线程发送,服务器发送完成的平均耗时在10s左右,如下图所示。

服务器推送耗时

2021-01-25 20:51:02.614 INFO [mp-tcp-gateway,54d52e7e4240b65a,54d52e7e4240b65a,false]
[600ebeb62@2559f4507adee3b316c571/507adee3b316c571] 89558 --- [nio-8080-exec-6]
c.i.m.t.g.controller.NotifyController: [] [UID:] send message ...
2021-01-25 20:51:11.973 INF0 [mp-tcp-gateway,54d52e7e4240b65a,54d52e7e4240b65a,false]
[1600ebeb62@2559f4507adee3b316c571/507adee3b316c571] 89558 --- [nio-8080-exec-6]
c.i.m.t.g.controller.NotifyController: [] [UID:] send message to 1001174 channels

一般同一用户同时建立的长连接都在个位数。

以10个长连接为例,在并发数600、持续时间120s条件下压测,推送接口的TPS大约在1600+,如下图所示。

长连接10、并发600、持续时间120s的压测数据

当前的性能指标已满足我们的实际业务场景,可支持未来的业务增长。

6、新方案的实际应用案例

为了更形象地展示优化效果,文章最后,我们以封面图添加滤镜效果为例,介绍了一个爱奇艺号采用新 WebSocket 网关方案的实例。

爱奇艺号自媒体在发布视频时,可以选择为封面图添加滤镜效果,引导用户提供更高质量的封面。

当用户选择封面图后,会提交一个异步的后台处理任务。

一旦异步任务完成,通过 WebSocket 将不同滤镜效果处理后的图片返回给浏览器,业务场景如下图所示。

从研发效率的角度来看,如果在业务系统中集成 WebSocket,至少需要 1-2 天的开发时间。

而直接使用新的 WebSocket 网关的推送功能,只需简单的接口调用就能实现数据推送,将开发时间降低到分钟级别,大幅提高研发效率。

从运维成本的角度来看,业务系统不再包含与业务逻辑无关的通信细节,代码的可维护性更强,系统架构变得更简单,运维成本大幅降低。

7、总结

WebSocket 是实现服务端推送的主流技术,适当使用可以有效提升系统响应能力,增强用户体验。

通过 WebSocket 长连接网关,可以迅速为系统增加数据推送能力,有效降低运维成本,提高开发效率。

长连接网关的价值在于

  • 1)它封装了 WebSocket 通信细节,与业务系统解耦,使得长连接网关与业务系统可独立优化迭代,避免重复开发,便于开发与维护;
  • 2)网关提供了简单易用的 HTTP 推送通道,支持多种开发语言接入,便于系统集成和使用;
  • 3)网关采用了分布式架构,可以实现服务的水平扩容、负载均衡与高可用;
  • 4)网关集成了监控与报警,当系统异常时能及时预警,确保服务的健康和稳定。

目前,新的 WebSocket 长连接实时网关已在爱奇艺号图片滤镜结果通知、MCN 电子签章等多个业务场景中得到应用。

未来还有许多方面需要探索,例如消息的重发与 ACK、WebSocket 二进制数据的支持、多租户的支持等。

说在最后:有问题可以找老架构取经

架构之路,充满了坎坷

架构和高级开发不一样 , 架构问题是open/开放式的,架构问题是没有标准答案的

正由于这样,很多小伙伴,尽管耗费很多精力,耗费很多金钱,但是,遗憾的是,一生都没有完成架构升级

所以,在架构升级/转型过程中,确实找不到有效的方案,可以来找40岁老架构尼恩求助.

前段时间一个小伙伴,他是跨专业来做Java,现在面临转架构的难题,但是经过尼恩几轮指导,顺利拿到了Java架构师+大数据架构师offer 。所以,如果遇到职业不顺,找老架构师帮忙一下,就顺利多了。

推荐阅读

《百亿级访问量,如何做缓存架构设计》

《多级缓存 架构设计》

《消息推送 架构设计》

《阿里2面:你们部署多少节点?1000W并发,当如何部署?》

《美团2面:5个9高可用99.999%,如何实现?》

《网易一面:单节点2000Wtps,Kafka怎么做的?》

《字节一面:事务补偿和事务重试,关系是什么?》

《网易一面:25Wqps高吞吐写Mysql,100W数据4秒写完,如何实现?》

《亿级短视频,如何架构?》

《炸裂,靠“吹牛”过京东一面,月薪40K》

《太猛了,靠“吹牛”过顺丰一面,月薪30K》

《炸裂了…京东一面索命40问,过了就50W+》

《问麻了…阿里一面索命27问,过了就60W+》

《百度狂问3小时,大厂offer到手,小伙真狠!》

《饿了么太狠:面个高级Java,抖这多硬活、狠活》

《字节狂问一小时,小伙offer到手,太狠了!》

《收个滴滴Offer:从小伙三面经历,看看需要学点啥?》

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/126574.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BPPISE数据科学案例框架

本专题共10篇内容,包含淘宝APP基础链路过去一年在用户体验数据科学领域(包括商详、物流、性能、消息、客服、旅程等)一些探索和实践经验。 在商详页基于用户动线和VOC挖掘用户决策因子带来浏览体验提升;在物流侧洞察用户求助时间与…

Kafka3.0.0版本——增加副本因子

目录 一、服务器信息二、启动zookeeper和kafka集群2.1、先启动zookeeper集群2.2、再启动kafka集群 三、增加副本因子3.1、增加副本因子的概述3.2、增加副本因子的示例3.2.1、创建topic(主题)3.2.2、手动增加副本存储 一、服务器信息 四台服务器 原始服务器名称原始服务器ip节点…

被问到: http 协议和 https 协议的区别怎么办?别慌,这篇文章给你答案

前言 作为软件测试师,大家都知道一些常用的网络协议是我们必须要了解和掌握的,比如 HTTP 协议,HTTPS 协议就是两个使用非常广泛的协议,所以也是面试官问的面试的时候问的比较多的两个协议;因为这两个协议有相似和关联的…

为什么说网络安全是风口行业?是it行业最后的红利?

前言 “没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万&…

移除链表元素_每日一题

“路虽远,行则将至” ❤️主页:小赛毛 ☕今日份刷题:移除链表元素 题目描述: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例1&…

初步了解android如何锁键

百年三万六千日,光阴只有瞬息间。 手机下面的三个图形,正方形,园形,三角形分别的什么建?都起到什么功能? 三角形的那个叫返回键,就是可以返回你的上一个操作; 圆形是HOME键,按一下可…

使用IntelliJ IDEA本地启动调试Flink流计算工程的2个异常解决

记录:471 场景:使用IntelliJ IDEA本地启动调试Flink流计算时,报错一:加载DataStream报错java.lang.ClassNotFoundException。报错二:No ExecutorFactory found to execute the application。 版本:JDK 1.…

实现在一张图片中寻找另一张图片的目标

OpenCV库中的SIFT特征检测算法和FLANN(快速最近邻搜索库)匹配算法来找到一个图片中的元素在另一个图片中的位置,并在源图片中标出它们的位置。 以下是一个简单的例子,使用OpenCV库,利用SIFT特征检测算法,在…

无涯教程-JavaScript - IMABS函数

描述 IMABS函数以x yi或x yj文本格式返回复数的绝对值(模)。 Excel中的复数 复数简单地以文本形式存储在Excel中。 当将格式为" a bi"或" a bj"的文本字符串提供给Excel的内置复数函数之一时,这被解释为复数。 复数函数可以接受简单数值,因为它等效…

PostgreSQL 数据库使用 psql 导入 SQL

最近我们有一个 SQL 需要导入到 PostgreSQL ,但数据格式使用的是用: -- -- TOC entry 7877 (class 0 OID 21961) -- Dependencies: 904 -- Data for Name: upload_references; Type: TABLE DATA; Schema: public; Owner: - --COPY public.upload_refere…

持续集成/技术交付全流程流水线工具的设计与落地

文章目录 持续集成/技术交付全流程流水线工具的设计与落地概述工具架构设计主要功能模块代码库Jenkins 流水线代码构建自动化测试产品部署监控报警 使用方法步骤一:安装 Jenkins步骤二:创建 Jenkins 流水线步骤三:配置监控报警步骤四&#xf…

【2023集创赛】加速科技杯二等奖作品:基于ATE的电源芯片测试设计与性能分析

本文为2023年第七届全国大学生集成电路创新创业大赛(“集创赛”)加速科技杯二等奖作品分享,参加极术社区的【有奖征集】分享你的2023集创赛作品,秀出作品风采,分享2023集创赛作品扩大影响力,更有丰富电子礼…

Linux文件操作

目录 复制文件、目录 cp 移动 重命名文件或目录 mv 创建删除文件 touch rm(remove) 创建删除目录 mkdir(make directory) rmdir(remove directory) 复制文件、目录 cp cp(copy) 同一个目录下复制,所以重命名了一下;把它复制到linuxcast.net/目录下可以…

方案:TSINGSEE青犀AI智能分析网关森林防火智慧监管平台方案

一、方案背景 森林是地球上最重要的生态系统之一,对环境、气候、水循环和空气质量具有重要影响。森林火灾会造成巨大的经济损失,具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点,严重危及人民生命财产和森林资源安全&a…

69、配置AWS服务,接收来自RTSP流的推送

基本思想:在上一篇的基础和视频教程之后,进行简单的aws服务,进行RTSP流的接收 第一步: 第二步:配置video_stream,记得选择香港节点 同时记录这个信息,后面的策略需要填充 第三步:进行策略设置 第四步:策略设置,选中右上角的创建策略 第五步、进行json填充 第六步:填…

骨传导耳机十大品牌有哪个,骨传导耳机十大品牌排行榜分享

在这个信息爆炸的时代,确实很容易在市场上找到各种各样的骨传导耳机品牌和型号,对于没有相关经验的消费者来说,他们很难判断哪些产品是真正值得信赖的,哪些可能有质量问题或者不适合自己的需求,现如今骨传导耳机的市场…

通过starrocks jdbc外表查询sqlserver

1.sqlserver环境准备,使用docker环境,可以参考使用flink sqlserver cdc 同步数据到StarRocks_gongxiucheng的博客-CSDN博客 部署获得sqlserver环境; 2.获取starrocks环境,也可以通过docker部署,参考:使用…

【VSCode】文件模板创建及使用.md

背景 最近使用VSCode学习Vue项目比较频繁,每次创建Vue文件都要手动写重复代码,特别麻烦,就上网查找自动生成代码的说明,结果发现VSCode有代码模板,怪怪,感觉发现新大陆了(low!)。 配置 打开配置 方式一&a…

基于SSM的物流管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

ansible 使用roles简单部署LAMP平台

目录 一、了解roles目录 二、基于构建LAMP平台创建roles目录 1、在192.168.115.148创建目录 2、书写php的测试页面 3、编写httpd角色的main.yml文件 4、编写mysql角色的main.yml文件 6、编写lamp的playbook 7、启动剧本 8、访问 一、了解roles目录 在Ansible中&#…