中国互联网络信息中心第57次《中国互联网络发展状况统计报告》显示,截至2025年12月,我国即时通信用户规模达到10.94亿,占网民整体的97.2%。即时通信已经嵌入日常工作,但一条消息从点击发送到对方屏幕亮起,背后并不是一个实时协议在单独工作。
实时消息不是某一个协议的能力,而是接入、路由、持久化、推送和确认五段链路的协同结果。WebSocket、MQTT这些名字,只对应其中的连接与传输层。真正决定体验的,是整条链路能否在断网、切换设备、群成员离线等情况下继续闭环。
一条消息到底走了哪几步
发送端按下发送后,消息先进入接入网关。网关完成身份校验、权限判断、格式检查和限流,避免无效请求直接打到后端。企业IM还会在这一层识别设备类型、网络环境和登录状态,为后续路由准备上下文。
网关之后是路由。服务端根据接收方账号、设备列表和在线状态,找到消息应该投递到哪些连接。单聊的目标通常是一个账号下的多个设备,群聊则要展开成员列表,再按在线状态拆分投递任务。
消息服务一般会给消息分配唯一ID和会话内序号,再写入存储。 先持久化再投递是常见做法,目的是让消息在服务重启、网络中断或客户端崩溃后仍能恢复。也有系统采用先投递后落库,再通过补偿任务修正状态,但企业沟通更看重可恢复性。
在线设备通过长连接收到消息,离线设备进入待补拉队列。接收端处理后返回确认,服务端更新投递状态。超时没有确认就触发重试,客户端发现重复消息再按消息ID去重。
图1 一条实时消息的端到端链路,消息要经过接入、路由、存储、投递和确认五次关键处理
长连接为什么是实时的基础
长连接的价值在于服务端不必等客户端先发请求,就能主动把新消息推过去。WebSocket在HTTP升级握手后建立双向通道,适合浏览器和桌面客户端。MQTT通过Broker维持客户端会话,报文开销更小,适合网络不稳定或终端数量多的场景。
连接建立之后,客户端要定期发送心跳,服务端用响应确认连接仍然可用。心跳间隔太短会增加流量和耗电,太长则发现断线太慢。移动网络切换、代理超时、NAT映射失效都会让连接悄悄断开,客户端需要具备自动重连能力。
重连不能简单地在失败后立刻重试。大量客户端同时断线时,集中重连会把网关压垮。常见做法是指数退避加随机抖动,再配合登录态刷新和增量同步,把连接恢复与消息恢复分开处理。
长连接网关保存用户ID、设备ID、连接ID之间的映射。消息到达后,网关查会话注册表,判断目标设备在哪个节点上。连接数很大时,这张表通常放在分布式缓存或专门的路由服务里,避免每个业务节点都维护全量连接。
网关层要解决连接规模问题,业务层要解决消息语义问题。把两者混在一起,后期扩容和故障隔离都会变得困难。成熟的做法是让网关只负责接入、鉴权和转发,让消息服务处理会话、序号、群成员和已读状态。
这些连接最终承载单聊、群聊、文件传输、撤回和已读回执等能力。 即时聊天产品页展示的会话界面,背后就是这条连接与消息服务链路。
手机应用退到后台后,操作系统可能冻结进程,长连接无法一直存活。此时新消息提醒通常依赖系统推送通道,推送只负责把用户叫醒,完整消息仍要在应用回到前台后通过接口补拉。把推送当成消息正文的可靠存储,容易造成内容缺失或状态不一致。
不丢、不重、不乱靠什么保证
消息可靠性不靠单一机制。 消息ID解决重复,会话序号解决顺序,ACK和补偿解决遗漏。这三组机制要一起工作,才能覆盖发送、存储、投递和展示四个阶段。
服务端为每条消息生成全局唯一ID,客户端发送时也带一个本地幂等ID。网络超时后客户端重试,服务端发现同一个幂等ID已经处理过,就直接返回原结果,不重复写入。接收端展示时再按服务端消息ID去重,避免同一消息在多条路径上到达。
会话内序号用于排序。服务端为每个会话维护递增序号,客户端本地保存最后收到的序号。断线重连后,客户端带上这个序号请求增量消息,服务端返回缺失区间,而不是把整个会话重新推一遍。跨会话不保证全局顺序,因为不同会话的消息本来就不需要互相排序。
ACK要区分三种状态。客户端收到消息是一个状态,服务端完成持久化是另一个状态,对方阅读是第三个状态。把三者混成一个已送达,会让产品语义失真。已读回执只代表客户端上报了阅读动作,不等于用户真的看清了内容。
图2 可靠投递依赖消息ID、序号、确认、重试和去重共同闭环,单独增加重试并不能解决问题
离线、多端和群聊为什么更复杂
接收方不在线时,消息不能一直停在发送端。服务端要把消息写入会话存储或离线收件箱,等设备下一次上线后按游标补拉。离线消息保留多久,取决于产品策略、存储容量和企业合规要求,没有一个适用于所有组织的固定答案。
移动端系统推送通常只携带摘要或提醒,不承担完整消息体。用户点开应用后,客户端再通过接口拉取缺失区间。这样既能减少推送通道的数据暴露,也能避免推送丢失导致消息永久缺失。
同一账号可能在电脑、手机和平板上同时在线。服务端要为每个设备记录独立的同步位点,消息到达时投递到所有活跃端,设备上线后再补齐各自缺失的区间。多端同步不是把同一条消息重复推给所有设备,而是让每个设备都能用自己的游标追上会话进度。
已读状态也会产生多端冲突。一个设备上报已读,其他设备需要同步这个状态,但用户可能只在通知栏扫了一眼。产品要明确已读的触发条件,技术侧则要保证状态更新有版本号或时间戳,避免旧状态覆盖新状态。
群聊的核心不是单聊循环。一个群有几百人甚至更多人,成员在线状态各不相同,服务端要决定写扩散还是读扩散。写扩散是给每个成员的收件箱写一份,读取快,但写入量会随成员数放大。读扩散是成员读取时从群会话拉取,写入轻,但读取压力集中。大型群通常采用混合策略,在线成员实时投递,离线成员按游标补拉。
群成员变动、历史消息可见范围、@提醒和已读统计都会改变扩散逻辑。新成员入群后能看多少历史消息,退群成员是否还能收到消息,管理员撤回一条消息后如何同步到所有设备,这些都不是单纯的消息传输问题。
图3 群聊要把同一条消息扩散到不同在线状态的成员,并在成员变动后继续保持同步一致
四种实时通道各适合什么场景
WebSocket适合双向在线沟通
WebSocket由IETF在RFC 6455中标准化,它在一次HTTP握手后建立基于TCP的双向通信通道。相比每次请求都重建HTTP连接,WebSocket更适合聊天、在线状态、输入提示和已读回执这类频繁双向交互。
在企业IM里,客户端登录后建立WebSocket连接,消息发送可以走同一连接,也可以走独立的HTTP接口。服务端通过连接推送新消息、撤回事件、群成员变化和在线状态。心跳与Pong帧用来判断连接是否仍然有效,断线后客户端按退避策略重连。
它的优势是低延迟、双向、浏览器原生支持,适合Web端和桌面端。局限也很明显,长连接需要持续维护,负载均衡要处理连接归属,代理和网关可能切断空闲连接,移动端后台无法长期保活。 WebSocket适合在线双向沟通,不适合被当成万能推送通道。
MQTT适合弱网和大量终端
MQTT是OASIS标准下的发布订阅协议,客户端通过Broker订阅主题,发布者把消息发到主题,由Broker完成匹配和分发。它的报文开销小,适合带宽有限、网络不稳定、终端数量多的环境,在物联网和移动设备通信中使用广泛。
MQTT提供QoS 0、QoS 1和QoS 2三种服务质量。QoS 0最多一次,QoS 1至少一次,QoS 2恰好一次。IM系统要根据业务选择,聊天消息通常不能接受丢失,但也要防止重复展示。保留消息、遗嘱消息和会话过期等机制,可以处理设备离线、异常断线和状态通知。
它的边界在于Broker运维和协议语义。浏览器不是MQTT的原生主场,业务系统还要自己补齐会话、权限、群组和已读逻辑。MQTT适合弱网终端、设备告警和跨地域消息总线,不等于一套完整的企业IM。
长轮询适合兼容性兜底
长轮询仍然使用HTTP。客户端发起请求后,服务端没有消息就保持连接一段时间,有消息或超时再返回,客户端收到响应后立刻发起下一次请求。相比短轮询反复询问有没有新消息,长轮询减少了空请求数量。
它的代价是每次消息后都要重建HTTP请求,连接占用和服务器并发压力都不低。消息频繁时,长轮询的延迟和资源消耗会明显上升。它适合代理限制严格、WebSocket不可用的环境,作为兜底通道使用。
如果产品必须覆盖老旧浏览器、特殊网关或受限网络,长轮询仍有价值。但把它作为主通道,往往意味着更高的服务器成本和更复杂的超时处理。
SSE适合单向通知
SSE基于HTTP提供服务器到客户端的单向事件流,客户端订阅后持续接收文本事件。它支持自动重连和事件ID,客户端可以用最后收到的事件ID续传,适合通知、公告、任务进度和内容更新。
SSE的实现比WebSocket简单,穿防火墙的能力也更好。但它只有服务端到客户端一个方向,客户端发送消息仍需另走HTTP接口。浏览器对并发连接数有限制,代理缓冲也可能影响事件到达的实时性。
因此,SSE适合作为通知链路或轻量实时更新的补充,不适合单独承担完整IM。 四种通道没有绝对优劣,关键是让协议能力与网络环境、终端形态和业务语义匹配。
私有化部署改变了什么
私有化部署把消息服务、数据库和文件服务放进企业自有服务器或专有云,客户端通过内网、专线或受控的公网入口访问。消息不再经过第三方公有云,数据边界、账号体系和运维责任都回到企业侧。
实时原理没有变化,仍然是长连接、路由、存储、推送和确认。变化发生在网络边界。企业可能只允许内网访问,服务器不连接外网,所有客户端都在内网使用;也可能给服务器配置公网IP,让外部设备通过公网接入。两种方式对应的证书、端口、防火墙和移动推送策略不同。
私有化部署不是把服务器装进机房就结束。证书更新、账号权限、补丁升级、备份恢复、日志审计和容量规划,都会影响实时链路的稳定性。把安全问题全部寄托在内网两个字上,容易忽略内部账号泄露和运维误操作。
喧喧IM采用服务端、消息中转服务器XXD、客户端XXC三层结构。服务端基于PHP、MySQL和ZentaoPHP,XXD使用Go处理高并发通信和文件管理,客户端基于Electron,覆盖Windows、macOS、Linux、iOS和Android。这样的分层把连接接入、业务处理和客户端交互分开,便于在私有化环境中独立部署和排障。
在消息链路上,喧喧IM支持多端消息漫游和实时同步,提供私有化部署、通信全链路加密、服务端文件加密存储,消息在数据库中加密存储。传输与服务端文件采用AES 256位加密。对于需要把数据留在企业内部的研发团队和行业组织,这些能力决定了消息不必离开自有网络。
喧喧IM还提供开源版和专业版,开源版核心功能开放,版本差异可查看 开源版说明。
与禅道等项目管理系统集成后,沟通消息和研发任务可以在同一套工作流里衔接。通过API、Webhook和机器人接入业务系统时,可参考 灵活扩展能力。
涉及组织隔离、IP登录限制、界面水印和LDAP认证等安全配置, 通讯安全页面有更具体的说明。
企业选型看五个指标
- 连接稳定性。客户端是否具备心跳、断线重连、弱网切换和连接迁移能力,不能只看演示环境里的消息速度。
- 消息可靠性。消息ID、会话序号、ACK、重试、去重、离线补拉和多端游标是否完整,决定异常恢复时会不会丢消息或重复展示。
- 群组能力。大型群的扩散策略、成员变动、历史消息权限、已读统计和撤回同步,都会影响实际使用,群人数上限只是一个表面数字。
- 部署与运维。私有化环境里的端口、证书、备份、监控和升级方案要提前确认。只问能不能部署,不问怎么维护,后期容易陷入被动。
- 安全与扩展。传输加密、账号认证、组织隔离、审计、数据保留策略,以及API、Webhook和机器人能力,决定这套IM能不能进入企业的真实业务流程。
资料来源
- 中国互联网络信息中心,第57次《中国互联网络发展状况统计报告》,2026年2月发布。数据摘编见 https://www.199it.com/archives/1816827.html
- IETF,RFC 6455,WebSocket协议,2011年12月。https://www.rfc-editor.org/rfc/rfc6455.html
- OASIS,MQTT 5.0规范,2019年。https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html
- MDN Web Docs,Server-sent events。https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events
FAQ
即时通信一定要用WebSocket吗
不一定。WebSocket适合Web端和桌面端的双向在线沟通,移动端后台提醒往往依赖系统推送,服务端内部还可能使用消息队列。协议只是链路的一段,关键是接入、路由、存储和确认能否闭环。
为什么消息有时会延迟几秒
常见原因包括网络切换、长连接重连、服务端排队、群消息扩散量过大和移动端后台推送延迟。延迟出现在哪一段,要看客户端日志、网关指标和消息服务耗时,不能只归因于网络。
离线消息一般保存多久
没有统一答案。保存时长取决于产品策略、企业配置、存储容量和合规要求。企业选型时应明确离线消息保留周期、清理规则和备份方式,避免把临时缓存当成长期归档。
群聊消息如何保证顺序
服务端通常为每个群会话维护递增序号,客户端按序号排序并去重。群内消息可以有序,不同会话之间不保证全局顺序。跨设备同步时,各设备用自己的游标补齐缺失区间。
私有化部署还能做到实时吗
可以。实时性主要取决于长连接、路由和消息服务,不取决于服务器是否在公有云。私有化环境要额外规划端口、证书、内网DNS和移动端推送出口,网络边界处理不好才会影响体验。
已读回执能证明对方看到了吗
不能完全证明。已读回执通常表示客户端上报了阅读动作,可能由通知预览、多端同步或误触触发。对合规或流程要求高的场景,应把已读状态和其他确认机制结合使用。

867
联系我们
社群交流