实战经验分享:打造千万级直播项目,如何选择适合的长连接技术,告别CRUD开发

news2024/9/23 9:36:38

前言

其实不管大厂、小厂,做业务开发的同学都知道,写一个功能,有中台,有架构,有API,有SDK,很多可复用的代码直接调一下RPC接口或者一个注解就搞定了复杂的操作,所以很多螺丝钉们都没法真正接触底层核心组件、功能的设计和编写,更别谈在项目中会有什么技术选型、做决策、落地的操作,长此以往,技术广度、深度、落地能力 一个都没锻炼出来,所以为什么说大厂中P7是个分水岭,这句话不是毫无道理的。

业务场景

先说这一次的业务场景,不讲业务场景空谈选型方案的都是耍流氓。

  1. 需要实现直播房间内服务端与客户端之间的数据通信
  2. 需要一个延迟很低/实时的通信方案
  3. 通信需要支持双向流
  4. 对用户客户端设弱网抗性要强
  5. 性能要很强,支持高并发操作,大规模长连接集群
  6. 服务端与客户端之间接口兼容与版本迭代方便

带着这几个业务场景,我们开始进行选型操作

长连接调研

Http长连接

在 HTTP 协议中,使用 Keep-Alive 或者 Connection: keep-alive 参数来实现长连接。

优势

  1. 简单易用,不需要额外的协议支持。
  2. 操作简单,适用于轻量级的网络应用场景。

缺点

  1. 只能在客户端主动发起请求时才能使用。
  2. 无法在服务器端主动推送。

TCP 长连接

优势

  1. 实时性较高,可以实现双向通信。
  2. 对于大规模并发连接场景,TCP 长连接占用的资源相对较少。

缺点

  1. 协议级别上不支持心跳检测、消息推送、断线重连等功能,需要业务代码自行实现。
  2. 难以处理跨网络环境的 NAT 等问题。

Comet

Comet 是一种以 Ajax 技术为基础的服务器推送技术,通过长轮询、短轮询等方式实现服务器向客户端推送数据,适用于消息推送、在线聊天等应用场景。

优势

  1. 实时性较高,可以实现双向通信。
  2. 可以通过 HTTP 协议进行通信,在网络环境复杂的情况下更加稳定。

缺点

  1. 需要对 HTTP 协议进行 hack,增加了很多复杂度,也可能存在安全隐患。
  2. 需要考虑服务器的负载均衡和可靠性等问题,比较复杂。

MQTT

MQTT 是一种轻量级的发布/订阅协议,可以在低带宽和不稳定网络环境下使用,适用于物联网、移动应用等场景。

优势

  1. 非常适合物联网场景,支持大量连接和消息推送。
  2. 对网络带宽的占用相对较小。
  3. 通信效率高、开销小、支持 QoS2 消息传输。

缺点

  1. 需要引入 MQTT 协议栈,对客户端和服务器的支持有一定要求。
  2. 实时性不够高,延迟可能会比较大。
  3. 需要考虑协议的可靠性和安全性等问题。

Webscoket

HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议,基于TCP传输协议,并复用HTTP的握手通道。

优势

  1. 实时性:Websocket可以实现实时双向通信,服务器可以主动向客户端推送消息,避免了传统HTTP协议需要轮询的问题。
  2. 减少通信量:Websocket采用二进制帧传输,相比传统HTTP协议的文本传输方式,能够大幅减少通信数据量,提高传输效率。
  3. 跨域支持:Websocket支持跨域通信,可以在不同域名的页面之间进行实时通信。
  4. 节省服务器资源:由于Websocket需要维持长连接,因此服务器和客户端之间的握手操作只需要进行一次,节省了服务器资源。

缺点

  1. 兼容性:Websocket不是所有浏览器都支持,特别是旧版本的浏览器不支持Websocket协议。
  2. 状态维护:Websocket需要维护连接状态,需要服务器端进行连接管理,否则可能出现连接异常或数据丢失等问题。
  3. 安全性:Websocket协议通过HTTP协议建立连接后,往往会直接升级为Websocket协议,这样就可能存在安全漏洞,例如跨站脚本攻击(XSS)。
  4. 开销:Websocket长时间维持连接,需要占用服务器资源和带宽,可能导致服务器压力增大,需要进行合理的优化和管理。

gRPC

gRPC是一种高性能、开源的远程过程调用(RPC)框架,提供了跨平台、跨语言的服务通信解决方案,先来看下,它支持很多种开发语言。

a98c607a7abfdef1d41e4275adf38b06.jpeg

优势

  1. 高效性:gRPC使用HTTP/2协议进行通信,支持多路复用和二进制传输,具有较高的性能和效率。
  2. 跨平台、跨语言:gRPC支持多种编程语言,可以在不同平台上使用。
  3. 自动生成代码:gRPC支持基于IDL(接口定义语言)自动生成代码,简化开发流程,减少手写代码的工作量。
  4. 支持流式处理:gRPC支持流式请求和流式响应,能够满足大部分实时数据处理需求。
  5. 可扩展性:gRPC支持自定义插件,可以扩展其功能,适应不同的业务场景。
  6. 安全性:gRPC支持SSL/TLS加密通信,保证通信安全性。

缺点

  1. 学习成本:gRPC需要对IDL和gRPC的实现细节有一定的了解,对初学者而言可能有一定的学习曲线。
  2. 部署难度:gRPC需要依赖特定版本的库和工具,需要进行相应的环境配置和部署。
  3. 兼容性:由于gRPC使用HTTP/2协议通信,不支持低版本浏览器和特定网络环境下的代理服务器。
  4. 适用场景:gRPC适用于高并发、分布式、跨语言的服务通信,但在一些简单的场景下可能会造成过度设计。

选型分析

下面将用一个表格,从多个维度去分析它们的硬核实力与落地难度。

7a7ca480f6bf6e9f1050880f04cb2ec8.jpeg

从上表可以看出,不同类型的长连接在各方面的表现有所不同。

  • Http长连接适用于轻量级web应用场景,具有跨平台性和兼容性优势,但性能和延迟较低。
  • Tcp长连接在性能和可扩展性方面表现出较大优势,但安全性相对较低,适用于数据库连接、消息队列等场景。
  • gRpc长连接适用于实时通信、微服务、云计算等场景,具有高性能和可扩展性,使用成本较高。
  • Websocket长连接适用于实时通信、游戏、在线聊天等应用场景,具有高效率和实时性,但需要浏览器和服务器端支持WebSocket协议。
  • Mqtt长连接适用于物联网、移动应用等场景,具有较好的安全性和兼容性,但性能和延迟一般。
  • Comet长连接适用于消息推送、在线聊天等场景,具有兼容性和使用成本的优势,但性能和延迟较低。

综合以上分析,在我们的业务中选择Websocket/gRpc长连接作为通信协议都是可行的,因为它们都具有较好的通信效率和实时性,适用于实时语音、视频通信等应用场景。但是需要注意,为了避免产生大量的长连接导致服务器压力过大,需要限制长连接数量。此外,还要加强网络安全保护,防止信息泄露和攻击。

最终方案确认

gRPC 和 WebSocket 的最终抉择

先说结论,根据我们的业务场景和一些考虑,选择了gRpc,原因:

  • 明确的数据格式:gRPC 使用 Protocol Buffers 作为数据格式,可以更好地定义数据结构、方法等,并自动生成客户端和服务端的代码。而 WebSocket 没有明确的数据格式标准,需要在应用层进行约定。
  • 更高效的序列化和反序列化:Protocol Buffers 是一种轻量级的二进制序列化协议,在序列化和反序列化方面比 JSON、XML 等文本格式更高效,能够更快地传输数据。
  • 更快的速度和更低的延迟:gRPC 基于 HTTP/2 协议,支持多路复用、流控等特性,能够更快地传输数据,并提供更低的延迟。而 WebSocket 也使用 TCP 连接,但需要额外的应用层协议支持,不能像 gRPC 一样直接使用 HTTP/2。
  • 更好的可扩展性:gRPC 支持多种负载均衡策略、服务发现机制等特性,可以更好地处理大规模集群环境下的网络请求。同时,gRPC 还提供了基于拦截器的中间件机制,可以方便地实现日志记录、身份验证等功能。

综合以上优势,可以看出 gRPC 在性能、效率、可扩展性、开发效率等方面都具有很大的优势,至此,长连接调研与选型最终确定。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对python中切片详解

嗨喽,大家好呀~这里是爱看美女的茜茜呐 Python中什么可以切片 Python中符合序列的有序序列都支持切片(slice) 如:列表,字符,元祖 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ python源码、视…

YOLO目标检测——人体行为数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用:在人流量统计、行人闯入/越界检测、人群密集/拥堵检测预警等场景中,对监控场景中是否存在人体进行检测,并精确定位、追踪。数据集说明:,真实场景的高质量图片数据,数据场景丰富,含…

day49--动态规划8

139.单词拆分 关于多重背包,你该了解这些! 背包问题总结篇! 第一题:单词拆分 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明&#xff1…

[Database] MySQL 8.x Window / Partition Function (窗口/分区函数)

🧲相关文章 [1] MySQL 系统表解析以及各项指标查询 [2] MySQL 5.7 JSON 字段的使用的处理 [3] MySQL经典练习50题 简介 MySQL 8.0版本开始支持窗口函数 官方文档 在之前的版本中已存在的大部分聚合函数,在MySQL 8 中也可以作为窗口函数来使用 方法 / …

地址空间收尾-进程控制

子进程为什么能继承父进程的环境变量呢?并且具有全局属性? 通过打印地址实验可以发现,进程的环境变量在栈区之上 父进程的环境变量也是由bash继承下来的,必定有页表帮助我们从虚拟到物理的映射,创建子进程的页表时也会…

PowerCLI 实现email发送消息

前提条件 开启wmi,配置网卡,参考 创建发送获取信息到邮件 最终实现获取esxi 主机版本信息, esxi 主机IP,esxi开机开启状态,虚拟机名称,虚拟机IP,虚拟机开机状态,虚拟机归属哪一个物理机,发送信息到邮箱。脚本解释以下全部注释解释,请你在#部分获取。powercli-send-e…

HTML页面获取URL传递的参数值

如: // 查询url上链接的参数与参数值 function getQueryString(name) {var url window.location.search; // 获取URLvar pattern new RegExp("[\?\&]" name "([^\&])", "i"); // 正则匹配URLvar matcher pattern.exec(…

村田:什么是UWB无线通信?使用UWB的定位方法有哪些应用 ​

UWB是Ultra-Wide Band的缩写,意思是超宽带。UWB无线通信是使用超宽带的频率带宽的无线通信,其主要特征是能够实现高精度定位。近年来,已普及至智能手机防丢失、高阶汽车智能钥匙等民用设备。预计未来将在多个领域普及。 UWB无线通信技术有哪些…

浙江环保用电计量adw300-hj治污产污生产设备监测

浙江环保用电计量表,浙江环保用电能表,浙江环保督查计量电表,环保设备能耗采集表 企业基本信息 企业名称:XXXXXXXXXXX 企业地址:XX省XX市 工 程 量:X台监测仪表 预计工期:X天 监测点位信息…

Git撤销已经push到远程分支的commit

有时想要撤销已经push到远程仓库的commit,将代码还原为commit之前的样子,应该如何做呢? 如果只有自己使用的分支:可以使用git reset命令 git log 查看需要还原的commitId,如下截图, 我们需要撤销ffe4a的…

【API篇】十、生成Flink水位线

文章目录 1、水位线的生成原则2、有序流内置水位线3、乱序流内置水位线4、自定义周期性水位线生成器5、自定义断点式水位线生成器6、从数据源中发送水位线 1、水位线的生成原则 水位线出现,即代表这个时间之前的数据已经全部到齐,之后不会再出现之前的数…

具有独特底部轮廓的剥离光刻胶的开发

引言 金属图案的剥离方法已广泛应用于各种电子器件的制造过程中,如半导体封装、MEMS和LED的制造。与传统的金属刻蚀方法不同的是,采用剥离法的优点是节省成本和工艺简化。在剥离过程中,经过涂层、曝光和开发过程后,光刻胶会在晶片…

最简单的Ubuntu更新Nvidia驱动的方法 解决nvidia-smi 不是内部或外部命令

在装有Ubuntu/Linux的服务器上遇到nvidia-smi不是内部或外部命令的问题,解决方法:更新英伟达驱动。 Ubuntu自带的“软件和更新”里可以方便地更新驱动,不需要从英伟达官网下载驱动。 我把它改成了第一项(原来是一个名为nouveau的…

点成案例 | 点成生物干浴器的多领域应用

前沿 在前面的文章中,我们给大家分享了点成生物水浴设备在食品行业的食物特性和生物活性测定的应用案例,本期文章将为大家详细介绍一下点成生物的干浴设备及其在多种领域中的应用。 一、干浴器简介 干浴器,又名恒温金属浴或金属浴。与水浴设…

好用的Visio绘图文件工具 VSD Viewer最新 for mac

VSD Viewer是一款可以查看Microsoft Visio绘图文件的工具,适用于Windows和macOS操作系统。它具有以下优点: 直观易用:VSD Viewer的用户界面非常简单直观,易于使用。支持多种文件格式:VSD Viewer支持多种Visio文件格式…

JavaScript函数:入门指南

目录 函数的定义和调用 函数参数 返回值 匿名函数 回调函数 箭头函数的定义和语法 箭头函数的参数和返回值 箭头函数的this绑定 递归函数简介 基本情况 递归调用 注意事项 递归的应用 JavaScript是一种广泛使用的编程语言,拥有强大的函数功能。函数是J…

Java基础——流程控制

文章目录 顺序结构分支结构ifif elseswitch 循环结构forwhiledo while嵌套循环 流程控制语句breakcontinuereturn 流程控制语句是用来控制程序中各语句执行顺序,可以把语句组合成能完成一定功能的小逻辑模块。 顺序结构 程序从上到下逐行执行,中间没有…

系统优化-异步化

目录 1:异步化 1.1:什么是同步?什么是异步? 1.2:异步化业务流程分析 1.3:异步化的问题 2:线程池的理论和实战 2.1:为啥需要线程池? 2.2:线程池的实现 2.2.1:线程池参数 2.2.2:线程池的工作机制 1:异步化 什么时候使用异步化? 调用的服务处理能力有限&#xff0c…

酷开科技 | 酷开系统大屏电视,打造精彩家庭场景

在信息资讯不发达的年代,电视机一直都是个人及家庭重要的信息获取渠道和家庭娱乐中心,是每个家庭必不可少的大家电之一!在快节奏的现代生活中,受手机和平板的冲击,电视机这个曾经的客厅“霸主”一度失去了“主角光环”…