交付总览/源码实证
「全量源码」是可以当场核对的
这一页不放功能截图。放的是文件数、代码行数、目录分布、真实源码片段,以及全部业务表与接口的清单。统计口径写在下面,你拿到源码后可以用同一套口径复核。
业务表 132 张 业务接口 691 个 实时指令 85 个
全量源码不是一句口号,是可以数的
下面的文件数与代码行数都按同一套口径统计:去掉空行、整行注释与块注释,排除依赖目录、构建产物与自动生成文件。你拿到源码后可以用同样的口径复核。
统计口径
下面这几条会影响你怎么读上面的数字,尤其是第一条。我们把它写出来,而不是只报一个总数。
- 两棵 Dart 树是同一个 App 的两份独立代码树,所以客户端的诚实说法是「约 19 万行」,相加得到的 38 万行是重复计数。
改哪里,一眼能定位
上表是服务端 internal 下剔除测试文件后的源码分布,合计 270 个文件。这一层是「能不能自己改」的关键:业务规则都在 service,接口注册都在 router,换存储只动 repository。
server/internal/service
76
业务规则实现:消息幂等与序号分配、撤回编辑已读漫游、群与频道权限、钱包红包、会员成长、语音房玩法、媒体转码投递、敏感词风控、推送下发
这几段是从交付包里直接摘的
带文件路径和行号,你拿到源码可以翻到同一处对照。挑这四段是因为它们分别对应弱网不重复、少装中间件也能起、多端同时收到、内容能拦得住这四个最常被问到的问题。
消息幂等去重与会话内序号分配
server/internal/service/message.goL255-L276
弱网重发不会产生重复消息,靠的是这里先按客户端消息编号查一次幂等,再由服务端分配会话内单调序号。
if s.redisStore != nil && msg.ClientID != "" {
t1 := tracer.Mark()
业务完整度用表和接口说话
功能截图可以摆拍,表结构和接口数量摆不了。下面是全部业务表按模块的分布,以及接口按分组的数量。
业务表 132 张 另有内部用途 6 张,未计入 建表合计 138 张
标注为内部用途的表没有计入上面的业务表统计。
消息与会话
13 张messages消息正文与元数据
conversation_states会话状态:免打扰、置顶、已读位、清屏位
691 个业务接口,按分组摊开
客户端 393 个,运营后台 298 个,共 49 个分组。已排除性能剖析、静态资源、健康检查与接口文档这类非业务路由。
客户端接口 393 个
运营后台接口 298 个
消息为什么只有 7 个接口
「消息收发」只有 7 个 HTTP 接口不是漏数:消息的发送、已读、撤回、转发以及通话信令全部走 WebSocket 帧,不走 HTTP。所以衡量消息能力该看的是那 85 个 WebSocket 指令。
85 个 WebSocket 指令定义在协议编解码文件里,编号无重复。