知识百科
什么是离线消息?用户不在线时企业IM如何处理消息
离线消息是指用户不在线、客户端没有连上服务端时,别人发来的消息由服务端代为接收并暂存,等用户重新上线后再投递。企业 IM 的处理逻辑可概括为三步:判定在线状态、把消息落到服务端存储、用户上线时按位点增量补发。消息不会因为收件人没在线而消失,但“补发到什么程度”取决于产品的存储策略。
- 知识百科
离线消息是指用户不在线、客户端没有连上服务端时,别人发来的消息由服务端代为接收并暂存,等用户重新上线后再投递。企业 IM 的处理逻辑可概括为三步:判定在线状态、把消息落到服务端存储、用户上线时按位点增量补发。消息不会因为收件人没在线而消失,但“补发到什么程度”取决于产品的存储策略。
离线消息是什么
在线与离线的判定是即时通讯链路的分叉点。接收方在线,消息经长连接直接推送;不在线,则写入服务端为该用户维护的暂存队列。以 XMPP 标准的 XEP-0160 为例,服务端会为离线用户保存消息,待其下次登录后投递。因此离线消息并非“存在对方手机上”,而是“存在服务端等你去取”。
一条离线消息的完整链路
- 状态判定:服务端根据连接状态判断接收方是否在线,在线走实时推送,离线转入暂存;
- 落盘暂存:消息写入服务端的离线存储,并保留发送时间,供后续排序与补发;
- 上线拉取:用户登录后,客户端把本地已同步到的位置(位点或序号)提交给服务端;
- 增量补发与去重:服务端只返回该位置之后的消息,客户端按消息 ID 去重后再展示。
第三步决定体验好坏:全量重推既浪费流量又容易重复,行业通行做法是用位点做增量同步,让“拉到哪一条”在服务端与客户端之间形成共识。
两个绕不开的设计问题
存储模型怎么选。常见有两类:
| 存储模型 | 做法 | 优势 | 代价 |
|---|---|---|---|
| 写扩散 | 每用户一条离线消息流 | 增量同步简单,体验稳定 | 存储放大,大群写入压力高 |
| 读扩散 | 公共消息表 + 用户位点 | 存储成本低 | 拉取需遍历多个会话 |
补发到什么程度。离线消息通常有保留时长和条数上限,行业常见做法是保留数天到数十天,并限制单用户可暂存条数;超出上限时,有的系统向发送方提示失败,有的直接丢弃。可见“离线期间的消息都能补到”并不成立,重要信息仍建议配合其他触达方式。
多设备登录时怎么补
XEP-0160 只把离线消息投递给最先上线的设备,其他设备不会自动拿到同一批消息。行业解法是:服务端在消息归档中保留记录,其他设备上线后按时间或位点查询补拉。所以判断一款企业 IM 是否适合多端办公,不能只看“能不能多端登录”,还要看消息与会话记录能否在不同设备间保持一致。
企业选型时该关注什么
- 消息是否存在服务端:只存本地的方案,换设备或重装后找不回历史;
- 补发是否按位点增量:影响上线后的加载速度与是否出现重复消息;
- 多端是否一致:手机、电脑、网页端的会话与未读状态应保持同步;
- 数据存放在哪里:离线消息属于沟通数据,内网场景下应留在企业自有环境。
以 BeeWorks 为例,其企业即时通讯支持 Windows、macOS、Linux、iOS、Android 及 Web 多终端,用户可在不同设备之间同步消息、文件及会话记录。平台提供统一消息推送能力,业务系统可向指定成员、部门或群组推送审批提醒、待办提醒与系统告警,这类业务消息统一进入会话,与即时消息一并管理。由于支持私有化部署,离线消息、历史记录与相关状态数据落在企业自有环境中,并配合通信加密、消息存储加密与消息留痕等能力。
具体保留时长与补发规则仍以该产品官方文档为准。
FAQ
对方一直不上线,消息会一直保留吗?
通常不会。行业常见做法是设置保留时长与条数上限,超出范围的消息可能不再补发,重要事项建议同时用电话等方式确认。
为什么换新手机后只看到一部分历史消息?
常见原因是离线消息按位点增量补发,服务端只保留了一段窗口内的记录;超出窗口的历史需要产品提供单独的历史漫游能力。
内网部署会影响离线消息吗?
不影响机制本身。消息仍由内网内的服务端暂存与补发,区别在于这份数据存放在企业自己的环境里。