做实时传输的方案选型,本质上就是一场关于延迟、可靠性和成本之间的博弈。我在这个领域摸爬滚打了七八年,从最早的IM消息推送,到后来的音视频通话、IoT设备的数据回传,前前后后换过好几套技术栈,踩过的坑估计能写满一页A4纸。这篇文章我想把实时传输的选择方案这件事彻底讲透,聊聊不同场景下到底应该怎么选,以及每个方案背后的技术逻辑和实际坑点,希望能帮你少走一点弯路。
适合什么人看?如果你正在做Web应用的消息推送、IM聊天、在线协作、音视频通话、直播拉流,或者手头有物联网设备需要做双向实时控制,这篇文章都值得你花十几分钟读完。我会尽量少讲抽象的概念,多讲实际的选型思路和踩坑记录。
1. 先搞清楚:你做的到底是哪种“实时”?
很多人一上来就问我“哪个方案实时性最好”,这个问题本身就无法回答。“实时”两个字在不同的业务场景里含义完全不同,先定义好你要的是哪种实时,选型才不会跑偏。
1.1 低延迟交互:毫秒级的反馈
这类场景的特点是“人对人”或者“人对机”的直接交互,延迟高一点点,用户立刻就能察觉。典型例子是远程桌面、云游戏、协作白板、直播答题的抢答环节。这种场景下,端到端延迟通常要求在100毫秒以内,最好能做到50毫秒以内。因为我按下键盘或者移动鼠标的一瞬间,远端画面必须同步出现,否则你就会感觉“卡”。
对于这种场景,TCP往往是第一个被淘汰的对象,原因是TCP的丢包重传机制会让延迟在弱网下急剧膨胀。发生了丢包,TCP会停下来等待重传,这个时间取决于RTT,在跨国链路上动辄几百毫秒,体验完全没法接受。所以这类场景通常会选用基于UDP的自研协议,或者WebRTC,配合FEC前向纠错和适当的丢包隐藏,让接收方即使丢掉一些包也能把画面和数据拼出来。
1.2 准实时推送:秒级以下的消息
如果说毫秒级是强交互,那么准实时就是“消息发出去之后,对方能很快收到,慢个一两秒也没关系”。典型的场景包括IM聊天、站内信、工单提醒、支付结果通知、客服系统等。
这类场景延迟要求通常是1秒以内,偶尔到2秒也说得过去,关键是“不能丢”。一条转账失败的通知如果丢了,那问题就大了。所以这类场景往往更看重可靠性和持久化,而不是极限延迟。WebSocket、MQTT这些基于TCP的协议反而是主流选择,因为TCP自身的可靠传输机制加上业务层的确认重发,可以保证消息“最终一定到达”。
值得多说一句的是,准实时场景里,很多团队会把“实时性”和“推送能力”混为一谈。你要的不是一条链路速度多快,而是服务端能同时维护几十万、上百万条连接,并且能准确地找到目标设备把消息送过去。这才是这类方案真正的难点。
1.3 音视频流:帧率、码率和端到端延迟的三角平衡
音视频是最特殊的一类,它既要求低延迟,又要求高吞吐。你每秒要传30帧画面,每帧可能几十KB,同时还要保证音画同步,这跟传一条文本消息完全不是一个量级的问题。
音视频场景里,延迟的构成非常复杂:采集延迟、编码延迟、网络传输延迟、解码延迟、渲染延迟,每一个环节都可能成为瓶颈。对于直播场景,端到端延迟做到2到5秒已经算不错,用户能接受;但对于视频通话、在线会议这类强交互场景,端到端延迟必须控制在500毫秒以内,否则你说一句话对面半秒后才回应,整个对话的节奏就断了。
所以在音视频选型时,你要先想清楚自己是“播放型”还是“通话型”。播放型往下走要用CDN加直播协议,通话型则几乎只能选择WebRTC或者基于WebRTC的商业化方案,没有太多其他的可选项。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 主流方案全景:选型前必须认识的选手
定义清楚你的“实时”属于哪一种之后,再来对照认识一下市面上的主流技术方案。这里我把它们分成六个选手来聊,重点讲清楚每个方案最擅长什么、不擅长什么。
2.1 WebSocket:浏览器到服务器的默认答案
WebSocket是目前Web端实时通信事实上的标准方案,它跟HTTP一样跑在TCP上,但解决了HTTP只能“客户端请求、服务端响应”的问题。建连之后,服务端可以随时主动往客户端推数据,双向都可以发消息,而且不用像轮询那样反复建立连接。
如果你做的是Web页面的IM聊天、实时通知、看板数据刷新这类场景,WebSocket基本就是默认答案。浏览器原生支持,无需额外安装什么东西,随便一个Web框架都有现成的封装。
不过它有几个天然限制你得心里有数。第一,它基于TCP,弱网环境下丢包会导致TCP窗口收缩,延迟会明显上升;第二,浏览器对同一域名下的连接数有限制,虽然浏览器厂商在HTTP/1.1时代限制6个左右,HTTP/2和HTTP/3时代连接复用之后会好一些,但如果你在页面里同时开了多个WebSocket连接,连接数依然可能成为瓶颈;第三,WebSocket本身不提供消息确认和重发机制,业务层的可靠性和幂等性需要你自己设计。
2.2 WebRTC:音视频和P2P场景的王者
WebRTC是一个浏览器内置的实时通信框架,它厉害的地方在于把音视频采集、编码、传输、解码、渲染这一整套流程都封装好了,而且传输层默认走UDP,支持加密、音视频同步、丢包隐藏、带宽自适应等一整套复杂机制。
我最早接触WebRTC是在做在线教育项目,需要实现老师和学生之间的音视频通话。坦白讲,WebRTC的学习曲线相当陡峭,信令交换、ICE打洞、STUN/TURN服务器部署,每一个环节都有不少细节。但当你真正把它调通之后会发现,它在弱网下的表现确实比你自己用UDP堆一个传输协议要稳定得多,毕竟RFC 8829等一整套规范背后是全球各家浏览器厂商一起在维护和迭代。
WebRTC不只是用来做音视频,它的数据通道(DataChannel)也可以用来传输任意二进制数据。我见过有人用它做文件传输,能轻松跑满带宽,比基于HTTP断点续传的方案体验好很多。如果你需要浏览器与浏览器之间或者浏览器与App之间进行大量低延迟的数据交互,WebRTC的DataChannel值得认真考虑。
2.3 MQTT:物联网数据上报和命令下发的标配
MQTT诞生于1999年,最初是给石油管道做卫星通信用的,所以它的设计目标就是极简、省流量、能在极差的网络环境下工作。它的消息头非常小,固定头部最少只有2字节,这对低带宽的嵌入式设备来说极其友好。
MQTT的核心模型是发布订阅,设备往某个主题发布消息,订阅了这个主题的客户端就能收到。协议本身内置三种QoS级别:最多一次、至少一次、恰好一次。这个设计让它非常适合物联网场景,比如智能家居里的温湿度传感器上报数据,或者远程下发一个开关指令。
但MQTT有几个容易被忽略的坑。第一,它的“实时性”其实一般,虽然消息在网络上走得很快,但QoS级别的可靠性机制会带来额外的开销和延迟,QoS 2级别的四次握手在某些场景下慢得让人着急;第二,内置的遗嘱消息(LWT)和保留消息(Retained Message)虽然好用,但很多开发者并不清楚它们和会话状态之间的关系,配置不对会导致消息重复或者丢失;第三,消息的大小如果超过几百KB,MQTT的传输效率和内存占用都不太好看,它不是为传大文件设计的。
2.4 QUIC:弱网场景下的新选择
QUIC是Google在2013年左右开始设计和实践的一个传输层协议,目前已经随着HTTP/3慢慢普及开来。它的最大特点是基于UDP实现了类似TCP的可靠传输,但又解决了TCP的很多老大难问题。
TCP有一个叫做队头阻塞的问题,一个连接里的数据如果有一个包丢了,后续的包即使已经到了也必须等这个丢的包重传完成才能被应用层读取。QUIC因为支持多路复用,每个流之间互相独立,一条流里的丢包不会影响其他流的数据读取。这个特性对于实时控制信号和音视频数据混合传输的场景非常有价值。
另外QUIC的建连速度也是优势。TCP加TLS握手需要1到2个RTT,QUIC因为连接信息和加密信息一起协商,通常0到1个RTT就能建立连接,这在移动端弱网环境下体验差异非常明显。我们之前测过在200ms RTT的卫星链路上,QUIC的首包时间比TCP快了一倍多。
不过QUIC的问题是中间件生态还不够成熟。很多企业内部的防火墙和NAT设备对UDP流量的处理策略非常保守,UDP被限速或者限流的状况并不少见,这会导致QUIC在某些企业网络里的表现不如TCP稳定。
2.5 传统直播协议:RTMP、RTSP、HLS、HTTP-FLV
如果你做的是直播推流和拉流,也就是一个人推流、成千上万人看的场景,那RTMP、RTSP、HLS、HTTP-FLV这一组协议是绕不开的。
RTMP是Adobe推出来的,基于TCP,延迟一般能做到2到5秒,很多传统直播平台的上行推流用的都是它。RTMP的问题是不支持浏览器直接播放,需要转封装成其他格式才能播放。
RTSP主要用在摄像头、安防监控领域,它的设计目标是控制音视频流媒体,支持暂停、快进、回放等操作。如果你做的是监控平台,RTSP基本是标配。
HLS是Apple推的标准,基于HTTP,优势是能穿透绝大多数防火墙,而且天然支持视频点播和自适应码率。但HLS的延迟非常高,传统的HLS是10秒左右的延迟,即使切片做得再小,也很难低于5秒,所以它不适合强交互场景。
HTTP-FLV是国内直播行业比较流行的方案,原理是把FLV格式的数据块通过HTTP流式传输,配合CDN能实现1到3秒的延迟,比HLS体验好很多。缺点是播放端必须用Flash或者特定播放器,现在基本已经被移动端的原生播放方案取代。
2.6 自研UDP协议:控制类场景的终极方案
当上面所有方案都满足不了你的要求时,就轮到自研UDP协议出场了。我在做游戏服务器和远程控制项目时都走过这条路线,它是最灵活,也是最容易做砸的方案。
自研UDP协议的核心思路是:用自己的代码在应用层模拟一套可靠的传输逻辑。系统只负责把数据包发出去,至于对方有没有收到、要不要重传、重传几次,全部由你的业务代码决定。这样做的好处是你可以针对自己的业务场景做极致优化,比如某个消息重要性低,丢了就丢了;某个消息必须到达,那就可以设置快速重传和高优先级。
但坏处也很明显:工作量巨大,而且非常考验网络编程的基本功。你要处理半包、粘包、序列号管理、ACK确认、重传计时器、拥塞控制等一大堆底层问题。我见过很多团队在自研传输层上折腾了大半年,最后发现功能跑通了,但弱网下表现依然很差,原因往往是拥塞控制的实现过于粗糙。所以,选择这条路之前,一定要先估算好投入产出比。
3. 选型判断的核心维度与决策框架
前面讲了很多方案,但真正到选型的时候,你会发现每个方案都有它的适用边界。这一节我来拆解一下选型时最关键的几个判断维度,以及我自己总结出来的决策框架。
3.1 延迟预算:先算清楚你真正能容忍多少毫秒
选型的第一件事,不是选协议,而是定延迟预算。不要把“实时”三个字想得太美好,先回到业务本身,问自己一个问题:从数据产生到数据被消费,你能容忍的最长时间是多少?
打个比方,如果一个在线文档的多人协作,光标位置同步的延迟超过200毫秒,人就会觉得像在跟自己较劲;但同样是这个操作,如果换成异步保存草稿,延迟三十秒都没关系。所以“实时”的标准必须由业务来定,而不是由技术方案来定。
我习惯把延迟预算拆成三个部分:网络传输延迟、服务端处理延迟、客户端处理延迟。网络传输延迟的底线值,可以结合你的用户分布和公网环境做一次简单测算。比如你的用户大多在国内,跨运营商的情况下RTT可能达到50到80毫秒,如果目标端到端延迟是500毫秒,那留给服务和客户端处理的只有300多毫秒,这样算下来你大概就知道WebRTC这类自带音视频处理能力的方案是否更省心。
3.2 丢包与重传:TCP可靠性和UDP低延迟的取舍
这是实时传输方案里最核心的一对矛盾。TCP用丢包重传换来了百分之百的可靠传输,但代价是延迟可能无限放大;UDP用丢包风险换来了确定性的低延迟,但代价是你必须自己处理丢包。
在做选型的时候,先想清楚你的业务能接受丢什么。如果是聊天消息,一条都不能丢,那就老老实实用TCP;如果是语音通话,丢掉50毫秒的声音数据,人耳其实几乎听不出来,那UDP加容错机制就非常合适。游戏操作指令同理,旧的操作指令可能已经过时了,丢掉反而比重传更合理。
这里有个容易被新手忽略的点:UDP不等于低延迟的同义词。如果业务上要求“不能丢”,而你选用了UDP,那么你必须在应用层补一套可靠的确认重传机制。这套机制的复杂度会直接消耗掉你选择UDP带来的性能优势。换句话说,单纯因为“UDP快”而选择UDP,但又要求100%不丢包,最后做出来的效果往往比直接用TCP更差。
3.3 连接模型:P2P、服务端中转还是发布订阅
第三个维度是连接模型。不同的方案背后是不同的拓扑结构,这直接影响了你的部署成本和扩展能力。
P2P模型的代表是WebRTC,两个客户端直接建连,中间的服务器只负责信令交换和穿墙辅助。优点是数据传输不经过服务端,节省带宽成本,延迟也最低;缺点是NAT穿透不是百分百成功,打洞失败后需要借助TURN服务器中转,而TURN中继的带宽成本很高。而且P2P很难做服务端的数据记录和行为审计,合规场景不友好。
服务端中转模型是WebSocket、自研TCP/UDP协议最常见的形态,所有数据都经过你的服务端,便于做权限校验、消息记录、内容审核,但延迟会比P2P多一跳,服务端带宽和并发处理压力也更大。这个模型适合对数据可控性要求高的业务。
发布订阅模型以MQTT为代表,它的优势在于解耦了生产者和消费者,服务端可以根据主题做消息路由,非常适合大规模设备接入的场景。但发布订阅模型的短板是不能自主控制每个连接的底层传输特性,遇到延迟敏感的业务会比较被动。所以实际项目里,我看到很多人会同时用两种模型,比如设备的传感器数据走MQTT上报,设备的控制指令走WebSocket实时下发,各取所长。
3.4 弱网优化:网络抖动和丢包后的表现
选型时还要重点考察方案在弱网下的表现。所谓弱网,不一定是带宽不够,更多时候是丢包、抖动、高RTT这些因素叠加的结果。电梯、地铁、地下车库都是典型的弱网环境,用户拿手机在高速移动时切换基站也会引发丢包。
TCP在弱网下的表现前面说过,存在队头阻塞和窗口收缩的问题;UDP虽然没有这些负担,但裸UDP在弱网下丢包率可以高到让你怀疑人生。WebRTC之所以在音视频场景被广泛采用,很大原因是它内置了拥塞控制和FEC前向纠错,丢包时可以把重要数据通过冗余编码恢复出来,而不是傻等重传。
对于非音视频场景,弱网优化同样重要。比如物联网设备在信号不好的地下停车场上报数据,你需要考虑协议头是否足够精简、是否支持断线自动重连、数据是否支持缓存补传。MQTT和HTTP/3在这方面各有优势,关键是看你的业务对“最后一条消息能否送达”的容忍程度。
3.5 技术选型对比表与决策流程
我把主流方案在几个关键维度上的表现拉了一张对比表,方便你快速定位。
| 方案 | 延迟表现 | 可靠性 | 弱网表现 | 适用场景 | 接入成本 |
|---|---|---|---|---|---|
| WebSocket | 低(正常网络) | 依赖业务层 | 一般 | IM、实时通知、看板 | 低 |
| WebRTC | 极低 | 依赖信令与业务 | 好(含FEC) | 音视频通话、P2P数据 | 中高 |
| MQTT | 中 | 高(QoS机制) | 较好 | IoT、传感器上报 | 低 |
| QUIC/HTTP3 | 低 | 高 | 好 | 移动端弱网、通用传输 | 中 |
| RTMP/HTTP-FLV | 中(2-5秒) | 高 | 中 | 直播推拉流 | 中 |
| 自研UDP | 取决于实现 | 取决于实现 | 取决于实现 | 游戏同步、远程控制 | 极高 |
这张表只是参考,真正的判断还要结合你的团队技术储备。一个很现实的规律是:如果一个方案需要你投入大量额外的研发资源去补足它先天缺失的部分,那它再“先进”也未必适合你。
4. 关键参数配置与实操要点
选好方案只是起点,真正决定线上表现的是各种参数配置和细节策略。这一节结合我踩过的坑,聊一聊最关键的几个实操要点。
4.1 心跳与超时设置
几乎所有长连接场景都绕不开心跳。心跳的作用是让对端确认连接还活着,同时也能探测到网络断开。很多人以为心跳间隔设得越短越好,实测下来根本不是这么回事。心跳太频繁会产生大量额外流量,而且在弱网下,心跳包本身也会丢失,频繁发送反而会让服务端误判客户端离线。
我常用的做法是:心跳间隔设为30到60秒,超时判死设为90到120秒。也就是说,如果服务端在90秒内没收到客户端任何数据,包括业务数据和心跳包,就判定连接已断。这个策略的好处是能同时兼容业务低峰期的静默状态。
另外一定要区分“TCP层的keepalive”和“应用层心跳”。TCP keepalive默认两小时才探测一次,完全不适合移动端实时通信;应用层心跳才能精确控制探测频率,并且能和业务层的离线通知对接起来。
4.2 消息确认与重传机制
如果你选了WebSocket或者MQTT这类方案,消息的确认和重传机制必须自己设计清楚。这里面最容易犯的错误是“发送方发出去的每条消息都要求ACK”,看起来严谨,实际在高并发下会严重影响吞吐。
更好的做法是区分消息的重要程度。普通通知类消息,发送后不要求回执,丢了可以补拉;指令类和控制类消息,必须要求接收方返回ACK,服务端收到ACK后才算发送完成。对于关键消息,还要设计“发送后超时未ACK就重发”的机制,重发时带上唯一的消息ID,接收方根据消息ID去重。
这里要特别提醒幂等设计。网络并不可靠,重传就可能导致重复消息,如果接收方不做去重,就会出现用户收到两条一样的重要通知,或者订单被重复扣款的严重后果。我在做支付通知时,服务端就是靠消息ID加Redis做去重,才避免了线上事故。
4.3 缓冲区与流量控制
很多开发者做实时传输时只盯着“发出去”这一头,忽略了接收端的处理能力,结果就是发送方每秒狂发几千条消息,接收方处理不过来,消息在本地缓冲区越积越多,延迟水涨船高。
这就像水龙头开得太大,下水道口又太小,水漫金山是迟早的事。传输层必须做背压控制。WebSocket场景可以依赖TCP的流控,但应用层还是要监控发送缓冲区的积压量,如果积压超过阈值,就该主动降级,比如把实时视频帧率降下来,或者丢弃部分非关键消息。
WebRTC的带宽自适应机制也是一个很好的参考,它会在检测到网络拥塞时自动降低编码器的码率,优先保证画面不卡死。你在自己做传输层时,也要给数据流分级,重要数据优先发送,次要数据可以延后甚至丢弃。
4.4 弱网参数调整实测经验
弱网环境是实时传输方案的试金石,我在项目里总结的几条实测经验分享给你。
第一,针对不同网络质量区间的处理策略要提前设计好。比如延迟在100ms以下时,一切照常;100到200ms时,可以考虑适当降低视频码率;200到400ms时,关闭部分非核心功能;超过400ms时,转为最低限度模式。不要把策略全部压在运行时随机应变,那一定是来不及的。
第二,移动端应用在切换网络类型时,比如从WiFi切到4G,长连接几乎必然中断,应用层必须监听网络状态变化,在恢复网络后立即重连,而不是干等心跳超时。
第三,不要过度相信公网质量测试的数据。内网测试和云端同地域测试的结果跟真实用户环境的差距可能非常大,最好的做法是在上线前做一次真实的弱网模拟测试,用Charles、Clumsy或者tc命令人为制造丢包和延迟,看看方案在你设定的最差场景下还能不能工作。
5. 常见问题与排查技巧实录
最后这部分,我整理了在实时传输项目里最常遇到的几个问题,以及对应的排查思路。每个问题都是线上真实遇到过的。
5.1 连接频繁断开,重连风暴怎么解决
这是做大量长连接接入时最先碰到的问题。某次业务高峰期,服务端压力稍大,处理变慢,于是客户端开始超时断连。断开后客户端会立即重连,重连又给服务端增加更多压力,导致更多连接断开,形成恶性循环,业内一般叫重连风暴。
解决方案有几个方向。一是客户端做指数退避重连,第一次失败后等待1秒重试,第二次2秒,第三次4秒,最多到60秒封顶,避免同一时间大量拥入。二是服务端在过载时主动开始丢弃非关键连接,优先保障重要客户端的连接不被踢掉。三是重连后要合理处理消息补偿,比如断连期间的未读消息,通过“拉取历史消息”而不是“推送全部离线消息”的方式补齐,降低瞬时压力。
5.2 消息延迟在某个时段突然升高
有段时间我们线上反馈IM消息经常延迟,排查了很久,最后发现是服务端有一个定时任务,每天中午十二点准时跑一批批量操作,把CPU和磁盘IO都打满了。消息处理线程抢不到CPU,延迟自然飙到几秒。
排查这类问题,首先要用APM工具把链路拆开看,到底是网络开销、服务端处理、还是客户端处理导致延迟。如果是服务端处理延迟,重点看CPU、GC、数据库连接池、线程池的占用情况;如果是网络延迟,可以对比不同地域、不同运营商的延迟曲线。
这类问题最隐蔽的是“看起来网络正常”,因为公网总体延迟是低平直的,但某个具体时段由于路由波动或运营商调度,延迟会瞬间升高。这种情况下,我会在客户端和服务端同时打点记录端到端延迟,把两边数据对齐比对之后,延迟在哪个环节积累就一目了然了。
5.3 NAT穿透失败率和TURN中继成本
做WebRTC或P2P方案时,NAT穿透失败是绕不开的痛点。终端网络环境五花八门,部分企业网络、公共WiFi、运营商级NAT都会让ICE打洞失败,这时候就只能走TURN服务器中转。
TURN中继的带宽成本会随业务规模快速增长,尤其是音视频数据,一小时几百GB的流量轻轻松松。我在部署方案时通常会在TURN服务器前面加流量统计和告警,一旦中继流量比例超过预期就报警,通过优化STUN配置、增加候选路径等手段来降低TURN的压力。
另外一个经验是,要特别关注客户端接入的网络类型分布。如果某个省份或者某个运营商的用户一直打洞失败,就要考虑是不是该区域的NAT设备策略太严格,这时候联系运营商或者切换到区域内就近的TURN节点,效果往往立竿见影。
5.4 TCP层连接数上限与端口复用
很多人在WebSocket服务端部署时会遇到连接数上不去的问题。这里有两个容易踩的坑:一个是Linux文件描述符限制,默认1024往往是瓶颈,需要调高;另一个是TIME_WAIT状态,频繁断开连接会产生大量处于TIME_WAIT的端口,不开启复用的话,新连接可能迟迟无法建立。
我一般会在部署系统上做这么几个调整,在/etc/sysctl.conf里追加配置后执行sysctl -p生效:
bash复制# /etc/sysctl.conf 中追加如下配置
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 1
net.core.somaxconn = 4096
fs.file-max = 100000
# 生效
sysctl -p
同时根据业务并发量调整ulimit的文件描述符数量,并建议所有连接都基于负载均衡器做会话保持,避免请求在多个后端之间漂移导致连接重建。
5.5 实时传输中容易被忽略的编码细节
最后一个坑可能很多人都踩过:同样的协议,同样的网络,客户端收到的数据却是乱码或者被截断。实时传输协议本质上都是在传输字节流,但不同的协议对消息边界的处理方式不一样。
TCP是面向字节流的协议,WebSocket在传输层之上用帧头声明了消息长度,所以应用层不需要处理半包;但是如果你直接裸用TCP或者自己封装UDP,就必须自己设计消息格式,比如“4字节长度+消息体”这种经典的封包方式,在接收端按照长度逐条拆包,否则很容易出现一条消息被拆到两次接收,或者两条消息粘在一起的情况。
这个话题看似基础,但越是在高并发实时场景,越容易因为边界处理不当引发诡异问题。建议所有自研传输协议的第一版,就严格要求消息帧必须包含长度字段和校验字段,宁愿多花几个字节,也不要为省空间埋雷。
我的体会很简单:实时传输的方案选型没有标准答案,唯一确定的是你要先定义清楚自己的实时类型和延迟预算。我自己每次做新项目的实时通信设计,都会先花一整天时间盘清楚:我要的是毫秒级交互、秒级可靠推送,还是音视频流?目标定下来了,用哪套方案基本就是顺理成章的事。后面遇到的坑虽然多,但大多数都有迹可循。最后再分享一个小技巧:无论选了哪个方案,在设计阶段就要留好切换冗余,接口层尽量抽象成消息收发模型,别让业务代码跟某个协议绑死。这个习惯救过我很多次,希望你也能用上。
