离线回来,中间那段消息去哪了:飞享IM 会话断层的发现与补齐
手机关机一个晚上,第二天打开飞享IM,群里已经聊了几十条。最新的消息都在,往上翻,翻着翻着就从今天早上直接跳到了昨天晚上,中间那一大段没了。这不是某一端的偶发 bug,Android、iOS、Web、PC 全都会出现。本文讲清楚这个问题是怎么产生的,我们为什么最终选择"服务端标出缺口、客户端按需补齐"的方案,以及在改动协议和四个客户端的同时,怎样把对现有用户的影响降到最低。

手机关机一个晚上,第二天打开飞享IM,群里已经聊了几十条。最新的消息都在,往上翻,翻着翻着就从今天早上直接跳到了昨天晚上,中间那一大段没了。这不是某一端的偶发 bug,Android、iOS、Web、PC 全都会出现。本文讲清楚这个问题是怎么产生的,我们为什么最终选择"服务端标出缺口、客户端按需补齐"的方案,以及在改动协议和四个客户端的同时,怎样把对现有用户的影响降到最低。

不方便外放语音的时候,"转文字"几乎是刚需。飞享IM 的语音消息转文字现已在服务端、Android、iOS、PC 桌面端、Web 端全面上线。这次功能在协议层只做了三件事:枚举末尾追加 1 个子信令 ASR、proto 末尾追加 2 个 message、既有定义 0 处改动,旧版客户端完全无感。本文完整说明这个功能的设计、服务端链路与四端实现,并借此讲清楚飞享IM 服务端"只增不改"的可扩展性。

三天,四个仓库,41 个提交,约一万行新增,给飞享IM 加了一个听起来很小的功能:把「保存到通讯录的群组」「会话置顶」「消息免打扰」同步到服务端,换设备或重装后能拉回来。这篇复盘的重点不是功能本身,而是人与 AI 的分工是怎么切的:AI 负责设计、计划、实现、审查、修复的完整闭环,人负责定产品约束、做技术裁决、在 AI 判断失灵时给出现场证据。过程中同一类缺陷在四个端上换了四种形态,被这套协同流程拦下三次、漏掉一次——漏掉的那次,恰恰最说明协同的边界在哪。

自研二进制协议要扛住"省、可切包、可分类、可加密、可演进"五条约束,这些原则听起来抽象,但落到一个真实跑在生产环境的 IM 服务端里,每一条都能在代码里指认到具体的类和字段。这篇文章以飞享IM(FshareIM)服务端 chat-server-pro 为例,从源码层面拆解这套自研协议是怎么把上述原则一条条实现出来的:10 字节包头怎么切包、Signal/SubSignal 两级命令字怎么分发、心跳和 ACK 怎么关联、AES 加密放在协议的哪个环节、版本位怎么预留,以及 TCP 二进制和 WebSocket JSON 这两条通道是怎么在同一个接入层里协同工作的。

飞享IM(FshareIM)是一款支持私有部署的即时通讯系统,服务端采用 Java 实现,核心由 push-connector(接入层) 和 push-group(业务层) 两个服务组成。本文从实际运行角度梳理系统的13个核心技术模块,逐一说明当前方案的设计思路、存在的隐患,以及对应的改进建议,帮助开发者快速理解系统全貌。
每个工作日美东时间 8:00 AM,一个 Agent 自动从多个渠道并行采集信息,调用 Claude 生成中文盘前日报,通过飞享IM推送到手机。整个流程无人值守,从数据采集到消息送达不到 20 秒。