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

前言

其实不管大厂、小厂,做业务开发的同学都知道,写一个功能,有中台,有架构,有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.mzph.cn/news/117793.shtml

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

相关文章

OPC UA:工业领域的“HTML”

OPC UA是工业自动化领域的一项重要的通信协议。它的特点是包括了信息模型构建方法。能够建立工业领域各种事物的信息模型。在工业自动化行业,OPCUA 类似互联网行业的HTTP协议和“HTML”语言。能够准确,可靠地描述复杂系统中各个元素,并且实现…

机器学习中常见的特征工程处理

一、特征工程 特征工程(Feature Engineering)对特征进行进一步分析,并对数据进行处理。 常见的特征工程包括:异常值处理、缺失值处理、数据分桶、特征处理、特征构造、特征筛选及降维等。 1、异常值处理 具体实现 from scipy.s…

桶装水订水送水小程序开发搭建;

上门送水小程序桶装水配送是一款的同城上门配送平台,为用户提供便捷的桶装水配送服务。解决用户在获取干净健康的饮用水方面的需求,提供高效、便捷的在线预约和下单服务。 小程序平台开发,具备强大的技术支持和良好的用户体验。用户可以通过…

跨平台开发技术

目录 1.Qt1.简介2.优势3.劣势 2.NET CoreVue1.简介2.优点 3.Flutter1.简介2.优点3.缺点 4.Maui1.简介2.优点3.缺点 5.Avalonia1.简介2.优点3.缺点 6. Cordova1.简介2.优点3.缺点 7.Electron1.简介2.优点3.缺点 个人搜集资料并总结了一些跨平台开发技术,如有不足欢迎…

分享一下怎么做一个房间预定链接

在旅游行业中,房间预定是非常重要的一环。随着互联网的普及和旅游业的发展,越来越多的人选择在网上预订房间。本文将介绍如何制作一个房间预定链接,以及推广该链接的方法和策略,帮助读者更好地了解房间预定的需求和实现方式。 一、…

隧道代理 vs 普通代理:哪种更适合您的爬虫应用?

前言 随着互联网的普及,爬虫技术在多个领域得到广泛应用。在进行爬虫开发时,代理服务器是不可或缺的工具之一。代理服务器可以隐藏客户端的真实 IP 地址和位置,从而保护客户端的隐私,同时通过代理可以绕过一些网络限制和安全机制…

什么是React中的高阶组件(Higher Order Component,HOC)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

迅为itop-3568开发板qt学习手册上新

基于RK3568的QT教程他来了~从C基础到QT编程实例再到项目实战,《iTOP-3568开发板QT学习手册》带你打通QT的任督二脉。 界面布局 3.5.1 水平布局 l Horizontal Layout:水平方向布局,组件自动在水平方向上分布 使用时先选中组件&#xff0…

设计模式中的黄金原则:引领你的代码风格,提升可维护性与扩展性

中国的先贤说过: 有道无术,术可求.有术无道,止于术. 术指的是技能、技术或方法,而道指的是原则、道德、智慧和理念。 西方古代的哲人也说过同样的话: 智慧之路从感性开始,却终极于理性.为什么要说设计原则呢, 因为设计模式通常需要遵循一些设计原则&…

Ant-Design-Pro-V5 :QueryFilter高级筛选组件、Table以及Pagination组件结合实现查询。

需求:根据 分类条件选择不同类型, table表格调取不同接口,展示不同数据。 代码: import React, { useRef, useState, Fragment, useEffect } from react; import { getNoticeInfo, getBannerList, delNotice } from ./service; …

windows系统ntp服务器一键开启

脚本 echo off REM 自动判断权限问题,主动获取管理员权限 echo off >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" if %errorlevel% NEQ 0 ( goto UACPrompt ) else ( goto gotAdmin ) …

探索随机森林: 机器学习中的集成学习神器

机器学习 第七课 随机森林 概述机器学习机器学习的主要分类监督学习无监督学习强化学习 集成学习提高准确性增强稳定性提升泛化能力 集成学习的主要方法BaggingBoostingStacking 随机森林的理论基础决策树的基本原理随机森林的生成过程随机森林的优势与局限性 随机森林的实际应…

vue2.0项目中组件和iframe之间如何传值

vue2.0项目中组件和iframe之间如何传值 一、vue组件二、iframe组件 一、vue组件 mounted() {// 注册 message 事件监听器,只注册一次window.addEventListener(message, this.handleFromIframeMessage) }, beforeDestroy() {// 移除事件监听器window.removeEventList…

C#实现数据导出任一Word图表的通用呈现方法及一些体会

疲惫的修改 应人才测评产品的需求,导出测评报告是其中一个重要的环节,报告的文件类型也多种多样,其中WORD输出也扮演了一个重要的角色。 实现方法比较简单,结合分析结果数据,通过WORD模板文件进行替换输出。在实现的…

关于报错java.util.ConcurrentModificationException: null的源码分析和解决

一般有这种问题,方法中至少会有List或者Map下的至少两个子类,有可能参数类型相同,也有可能不同都有可能触发这个问题!其主要原因是使用了ArrayList进行删除操作或者使用iterator遍历集合的同时对集合进行修改都有可能会出现这个问题 ArrayList属于List下的子类 需要区分的是Li…

qt的一些自绘控件

https://download.csdn.net/download/venice0708/88469835

嵌入式Linux_学习路线+基础知识

嵌入式Linux_学习路线基础知识 一、学习路线 说明:u-boot是一大块学起来需要三到六个月比较耗时,也属于比较落后的知识点,所以暂时不学习,内核也是如此暂时不学习,从应用层入手,先入门再深入 二、Shell指令…

MongoDB 的集群架构与设计

一、前言 MongoDB 有三种集群架构模式,分别为主从复制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)模式。 Master-Slaver 是一种主从复制的模式,目前已经不推荐使用。Re…

ARM | 传感器必要总线IIC

IIC总线介绍 1.谈谈你对IIC总线理解? 1)IIC总线是串行半双工同步总线,主要用于连接整体电路 2)SCL/SDA作用:IIC是两线制,一根是时钟线SCK,用于控制什么时候进行进行数据传输,时钟信号由主机发出; 另一根是数据线SDA,用于进行数据传输,可以从…

C# Winform编程(9)网络编程

网络编程 HTTP网络编程IPAddress IP地址类WebClient类WebRequest类和WebResponse类 WebBrowser网页浏览器控件TCP网络编程TcpClient类TcpListener类NetworkStream类Socket类 HTTP网络编程 IPAddress IP地址类 IPAddress类代表IP地址,可在十进制表示法和实际的整数…