layababa 问题全清单
对照三篇成文后,把我们自己的洞、限制、合同冲突全部摊开。不再用「不进排期」把问题藏掉。「不要抄别家那一刀」单独放在最后,那不是「我们没问题」。
总表
| ID | 域 | 问题 | 用户/接入会怎样 | 建议形态 |
|---|---|---|---|---|
| RTC-01 | 通话 | 新邀请把旧铃 CAS 成 REPLACED | 第二路来电把第一路偷掉 | 接线 |
| X-01 | 发送 | 关链抛 RATE_LIMITED | 接入首日 5 秒死循环重试,当自己限流 | 接线 + 改文档 |
| MSG-02 | 发送 | WS 不接 ConfirmUnknown | 当 500 / 可能误标已可见 | 接线 |
| OPS-04 | 发布 | 聚合 health 被可选 OSS 打红 | 消息已通,发布回滚 | 接线 |
| RTC-04 | 直播 | 主持失联后房间仍 LIVE | 观众停在空房 | 政策项目 |
| MSG-04 | 发送 | MQ01 先 VISIBLE 再落 Mongo | ack 后杀进程,history 可能没有这条 seq | 语义项目 |
| RTC-02 | 通话 | 一对一终态不拆 TRTC 房 | 房间残留、旧票 theoretically 能再进 | 顺手接线 |
| RTC-03 | 通话/直播 | refreshAfter 无换票 | 长会/长播媒体静默鉴权失败 | 长会项目 |
| RTC-05 | 直播 | 连麦先 count 再写 | 并发可批出第 5 路发布 | 小账本 |
| RTC-06 | 直播 | 连麦邀请只 push | 邀请丢了仍能 accept 上麦 | 小项目 |
| RTC-07 | 会议 | 主持 60s grace 在 JVM 堆上 | 多实例会丢宽限、双断或跳过 | 上多实例才痛 |
| RTC-09 | 通话 | 没有 Connecting,接听即开 30s 心跳 | 进房慢会被当成对端断网 | 状态机项目 |
| RTC-10 | 通话 | 无 CallKit / 独立 VoIP | iOS 杀进程后来电靠普通推送,容易漏 | 产品能力 |
| MSG-03 | 同步 | 重连每会话只拉一页 | 未打开会话正文不齐(合同故意限流) | 先改合同再改代码 |
| MSG-05 | 同步 | V3 跳号区间 vs 会话 sync 只有 cursor | 两套合同,打开/重连语义不一致 | 协议收口 |
| MSG-06 | 同步 | 缺口检测先抬 knownMax | 中间洞之后看不见(同时已报 missing) | 核对是否真漏修 |
| MSG-07 | 投递 | 私聊没有通知再拉;空会话无 ledger | 未打开会话 / 写失败只能靠以后打开再 sync | 带宽/多端项目 |
| MSG-08 | 群 | MQ06 扇出不含发送方其他设备 | 主叫另一台手机靠自己的发送回执,不靠直播扇出 | 多端产品 |
| RTC-08 | 通话 | onRemoteLeft 立即 hangup | 闪断变双方挂;已有 10s soft-leave | 先改 SLA 再改 |
| OPS-01 | 接入 | 默认拓扑最重且拒发 | 「5 分钟」假;自建是天级 | SKU 拍板 |
| OPS-02 | 接入 | 无仓内首条脚本;quickstart 漏好友门 | 按文档走不通还报限流 | 跟 X-01 一起 |
| OPS-03 | 灾备 | 恢复页仍停 bot-server / media | 按页操作会停错或拉不存在的镜像 | 改文档 |
| OPS-05 | 高可用 | 网关实例钉死 1,无排空 | 滚动升级全员掉线 | 已知债 · 连接平面项目 |
| OPS-06 | 高可用 | 跨节点默认关;好友投递账本在本地盘 | 多网关无法正确投递;只还 Mongo 会分裂 | 跟 OPS-05 |
| OPS-07 | 耐久 | Redis min-replicas-to-write=1 | 从库挂 = 全站不能写 | 已有 runbook,要不要改阈值是拍板 |
| OPS-08 | 容灾 | 无多活、无演练过的 restore | 机房故障只能接受单机合同 | 对外已诚实,别假装 HA |
| OPS-09 | 供应链 | 不交镜像,20 个 Maven 自建 8 张 | 客户交付面重 | 产品决策已定,列出来是现状 |
| DOC-01 | 文档 | 通话设计稿仍写 BUSY 状态、邀请就发 UserSig | 评审按过期稿打架 | 随 RTC-01 / 发证路径改文档 |
消息
接线 X-01 关链抛成 RATE_LIMITED
现状: refuseWithoutNewChainOwner 在没有热私聊 / MQ06 owner 时硬拒,抛 ErrorCode.RATE_LIMITED(retryable=true)。Flutter 发送/mutation 重试对该码固定 5s 泵,outbox 不结束。出厂 IMCORE_HOT_PRIVATE_ENABLED=false。首页仍写「5 分钟跑通第一条消息」,发送步不提好友门和三代旗。好友策略 requireCanSendPrivate 要求互为正式好友。
可能的 bug / 代价: 接入方按默认 compose 发第一条,看到「操作过于频繁」,永远重试同一 clientMessageId。关链、未互加、真 429 三种失败长得一样。旗已打开的生产栈不容易撞,新接入 / 评测栈必撞。
修复思路: 专用非 retryable 码 + hostAction=去开旗;客户端对该码 terminal。文档改成:先互加、且旗已开。不要默认开链,不要把容量满并进新码。
参考: Tinode {ctrl 503};Turms CLIENT_REQUESTS_TOO_FREQUENT;JuggleIM server-api-quickstart.sh 先互加再发。
接线 MSG-02 WS 漏接 ConfirmUnknown
现状: REST MessageController.sendPrivate 已把 HotPrivateConfirmUnknownException 收成 HTTP 200 + SERVER_CONFIRMING。该异常是 RuntimeException。WS wsPrivateMessage / handleV4 只稳接 BusinessException,其余变 INTERNAL_ERROR。ChatPersistedAck 会被 Flutter mergeAck 当成 VISIBLE。PREPARED 仍挡住第二条 seq。
可能的 bug / 代价: broker 抖动或 5s confirm 超时:客户端以为发送失败或已经可见。排障合同假。HTTP 兜底能救一部分,默认传输却先走 WS。
修复思路: 只在 wsPrivateMessage 对齐 REST:带 state,禁止无 state 的成功 ack。不要改 REST 200 合同。
参考: 仓内架构合同 4.1、Q474;对照文 hop H7。
语义 MSG-04 MQ01 先 VISIBLE 再落 Mongo
现状: prepare 先占 seq → confirm → markVisible → 回执带 seq,日志 mongo=pending。落库是 HotPrivatePersistenceConsumer.persistBody。gap-repair 跳过 hot-owned seq。DI-002 仍暂缓。
可能的 bug / 代价: ack 之后、persist 之前杀 im-core:发送方握着 seq,history 可能没有,补洞也不烧这条。对端若已扇出,一边看见一边拉不到。
修复思路(二选一,都不是一跳): 像 MQ06/Tinode 那样耐久后再回 VISIBLE;或让 v3_sync / gap-repair 能读 Redis 热序号。不要偷偷改,这是全体私聊 ack 语义。
参考: Tinode Save 后再 {ctrl 202 params.seq};MQ06 persist+outbox 同事务再 ack。
合同冲突 MSG-03 重连每会话只拉一页
现状: shouldDrainHasMoreDuringReconnectBatch 恒 false(FEX-034)。最多 50 会话 × 一次 v3_sync。打开会话才 drain(FEX-027)。列表预览靠 REST 刷新。群 signal 超前另走群同步。新设备登录推送只 toast。
可能的 bug / 代价: 长离线群积了远超一页,重连后未点开的会话正文不齐,用户以为丢了。这是故意限流,不是漏写循环。
修复思路: 若要改,先废/改 Q031「登录不得下全量、one-shot 不是全量同步」,再立项带阈值的 drain。不要当漏接线修,否则和 30 天 COLD 打架。
参考: OpenIM 连接后 GetMaxSeq 再按区间拉;Tinode since 拉到 count 控制帧。
协议债 MSG-05 两套同步合同
现状: WsV3SyncResponse 有 skippedSeqRanges;WsConversationSyncResponse 只有 safeCursor/hasMore。重连批量开关默认关。V4 通道里仍叫 v3Sync。
可能的 bug / 代价: 打开会话、重连、群 signal 三条路径的「洞」语义不一致,排障要对三份协议。
修复思路: 对外收成「每会话 maxSeq + 闭区间」。实现上可以两套,合同不能两套。
参考: OpenIM 一条 GetMaxSeq 打天下。
待核 MSG-06 缺口检测先抬 knownMax
现状: ImMessageGapDetector.checkMessage 在 newSeq>knownMax+1 时先把 knownMax 抬到 newSeq,同时报 missing 并走 repairLiveForwardGap(≤100 走 v3_sync,否则一页降序 query)。
可能的 bug / 代价: 若 repair 失败或只修了一截,中间号再也进不了检测器。复核认为「已回报 missing」所以不是漏修——失败路径仍可能丢洞。
修复思路: 先核对 repair 失败时 knownMax 会不会回滚。不要为了对齐 OpenIM 重写检测器。
参考: OpenIM 每条推送重算 lastSeq==synced+count。
多端 MSG-07 私聊没有通知再拉;空会话无 ledger
现状: 私聊与普通群 ChatFanoutPush 全文。TCP 写前才 registerAttempt PENDING。空会话从未建账本。写失败不回滚已 persist,靠工人重试(有 ledger 时)。
可能的 bug / 代价: 未打开、多端、写失败的私聊没有「先占序号再轻量通知」。空会话失败只能等以后打开再 sync。
修复思路: 可先在多端/未打开上复用超级群信号,不要再抄一套 OpenIM 全网关推全文。
参考: 野火先 insertUserMessages 再 QoS0 Notify。
多端 MSG-08 群扇出不含发送方其他设备
现状: MQ06 消费时 visibleGroupMembers 减发送方。发送方其他端靠自己的发送回执/出箱,不靠直播扇出。
可能的 bug / 代价: 主叫第二台设备可能看不到自己刚发的群消息,直到打开会话同步。这是刻意 recipient-only,改它会动证据模型。
修复思路: 若产品要「我的其他端实时看见」,应单独加发送方多端回推,不要把发送方塞进收件人集合凑数。
参考: OpenIM IsSenderSync;野火 exceptClientId 仍通知其他 session。
音视频 / 会议 / 直播
接线 RTC-01 新邀请偷走旧铃
现状: CallSessionManager.create() 先 replaceRingingSession,把双方已有 RINGING CAS 成 CANCELLED/REPLACED,再 occupy。CALL_BUSY 只挡 ANSWERED 且心跳还在。单测断言第二路 create 成功。
可能的 bug / 代价: A 打给 B 正在响,C 再打,A 的铃被静默替换。产品「对方忙」在振铃阶段不成立。这是日常路径。
修复思路: RINGING 占用直接抛已有 CALL_BUSY。不加 BUSY 状态,不重做双 key。
参考: JuggleIM grab 对 Outgoing/Connecting/Connected 回 16103;2026-07-05 稿 SETNX 即忙。
卫生 RTC-02 一对一终态不拆 TRTC 房
现状: 会议/直播终态已 enqueueDismissRoom。CallService.hangup / forceEndDisconnected / 振铃超时只出信令、卡片、话单。客户端会 exitRoom。
可能的 bug / 代价: provider 房间残留到 TRTC 空房超时。DismissRoom 不使 UserSig 立刻失效;振铃超时无人进房,接线接近空操作。主要是配额/控制台卫生,不是用户还停在通话里。
修复思路: 终态调用已有端口。不要换媒体栈。
参考: 仓内 MeetingTerminalService / BroadcastService.end。
长会 RTC-03 refreshAfter 不算换票
现状: 服务端按半 TTL 算 refreshAfter。Flutter 只解析。一对一 renewCredential fetch 后丢结果;直播 renew 空实现。真换票要对已进房 TRTC cleanup+re-enter+generation。
可能的 bug / 代价: 业务面仍 ANSWERED/LIVE,媒体静默鉴权失败。Call TTL=86400、通话上限 4h 时一对一几乎撞不到;直播更长会撞。
修复思路: 有真实长直播再立项整条续签。不要只挂 Timer 假装续上。Q395:缺长会数据先别拍。
参考: 对照文「发证时机 + 世代换票」,不是 Janus iceRestart。
政策 RTC-04 主持失联后房间仍 LIVE
现状: repairPresence 在 hostGrace(默认 120s)后只 markLeftIfActive,注释写明观众扫描永不自动结束主持房。不入队 DismissRoom。end() / transferHost 端口都在。LIVE-01 禁止 viewer sweep 隐式 end host。
可能的 bug / 代价: 观众停在没有发布者的 TRTC 房,直到有人点结束。运营看到一直 LIVE 的空房。
修复思路: 不能直接调人工 transferHost(要在场 admin)。应对齐会议「无发布者截止 + 系统角色」:到期转交在线管理员,否则 ENDED+拆房。一刀 end 会误伤连麦。
参考: 会议空房 emptyRoomDeadlineAt;essay「最后一名发布者消失必须终态」。
并发 RTC-05 连麦先数再写
现状: approve 先 count(isOnMic)>=4 再 viewer CAS。CAS 不管房间席位。没有 onMicCount 字段。
可能的 bug / 代价: 两管理员在麦=3 时同时批,可发出第 5 张 CALL_PUBLISH,TRTC 会进房。窗口窄。
修复思路: 房间文档 onMicCount<4 的 findAndModify,失败回滚。这是新账本,覆盖上/下麦/离场/关播。
参考: 对照文映射的房间级 CAS,不是 Janus publisher 上限。
控制面 RTC-06 连麦邀请只 push
现状: inviteLinkMic 只推送,无耐久行、无 TTL。accept 不依赖未过期邀请行。
可能的 bug / 代价: 推送丢了、过期了,对面仍能上麦。控制面没有「这张邀请还在不在」。
修复思路: 做成带 TTL 的邀请行,accept 必须读到。可和 RTC-05 并成连麦控制面一单。
参考: 一对一振铃 Redis 截止;JuggleIM Incoming 行。
多实例 RTC-07 主持 60s grace 在堆上
现状: MeetingKernel.pendingModeratorStaleGraceUntil 是进程内 ConcurrentHashMap。网关 EXPECTED_INSTANCE_COUNT=1。
可能的 bug / 代价: 现在单实例几乎不痛。一旦多实例或进程重启:宽限丢失,可能双断或跳过等待。
修复思路: 上多实例时再迁 Redis 心跳键。现在单独做是过度开发。
参考: 振铃截止已在 Redis ZSET。
SLA RTC-08 onRemoteLeft 立即挂断
现状: onRemoteLeft 立刻 finish+hangup。TRTC adapter 对短暂离房有约 10s soft-leave。connectionLost 标 recovering。心跳任务只扫 calling 活跃(TTL 30s)。
可能的 bug / 代价: 超过 soft-leave 的闪断会变成双方挂,话单 COMPLETED。若改成等 30s 心跳:会撤已写的约 10s 反僵尸,且「只离 TRTC、WS 还在」心跳看不见,可能挂死。
修复思路: 先改超时 SLA 文档,再改代码。不要既要 10s 反僵尸又要等心跳。
参考: JuggleIM 接通后等 ping(不要抄它记 Complete)。
状态机 RTC-09 没有 Connecting
现状: RINGING → ANSWERED 就开 30s 心跳。进房慢靠加 TTL 补。没有 MEDIA_CONNECTED。
可能的 bug / 代价: 接听后进房慢,心跳当对端断网。TTL 从 10s 加到 30s 是补丁不是结构。
修复思路: 进房完成前状态不允许心跳杀。纯改进,别和 RTC-01 捆一起。
参考: JuggleIM Incoming/Outgoing/Connecting/Connected。
产品 RTC-10 无 CallKit / 独立 VoIP
现状: 无 PushKit、无独立 voip token。野火是对照里证据最全的一套。
可能的 bug / 代价: iOS 杀进程/锁屏后来电容易漏或慢。不是信令状态机 bug,是系统来电能力缺口。
修复思路: 单独产品里程碑,不要塞进「吸收开源 IM」。
参考: 野火 PushKit + 前台服务;Tinode 形状对但仓库里 FIXME。
文档 DOC-01 通话设计稿过期
现状: 2026-07-05 稿仍写 BUSY 状态、邀请就发双方 UserSig。实现是邀请 mediaReady=false、无 BUSY 状态、振铃可被 REPLACED。
可能的 bug / 代价: 评审按旧稿打架,会把 RTC-01 修歪。
修复思路: 随 RTC-01 改稿,删邀请发证和 BUSY 状态。
运维 / 接入 / 容灾
接线 OPS-04 聚合 health 当发布闸
现状: readiness 组已排除可选 OSS。客户手册和 server-deploy.yml 仍 curl /actuator/health 与 /api/health,非 2xx rollback。#620:上传 200、聚合因 cdnOssProvider DOWN 变 503。
可能的 bug / 代价: 消息面已通,发布失败回滚;或为过闸关掉真依赖探针。
修复思路: 改绑 /actuator/health/readiness。不上 Prometheus 产线。
参考: Rocket.Chat /readyz;dev-example 已有部分绑 readiness。
SKU OPS-01 默认最重且拒发
现状: 源码 compose:Mongo rs0 单成员 + Redis 主从 + Rabbit + 8 JVM。旗默认关。不交运行时镜像,客户 20 个 Maven 自建 8 张。Spring starter 评估形态能开链、单 JVM,但不是官方默认。
可能的 bug / 代价: 按生产 SKU 跟文档走,第一条消息发不出去(叠 X-01)。自建是天级。
修复思路: 要你拍:embed/评测 profile 是否写成官方首条路径。八单元留生产。不是当晚拆微服务。
参考: Tinode single-instance 能发、cluster 加法;JuggleIM 一进程+MySQL。
文档 OPS-02 无首条脚本,quickstart 漏好友
现状: 首页五步直达发送。Core 发送步没有互加好友。无私有仓外可跑的断言脚本。
可能的 bug / 代价: 文档路径结构上走不通,再叠限流码,排障一天。
修复思路: 和 X-01 同一单:文档步骤 + 可选仓内脚本(开旗、互加、发一条、断言非 RATE_LIMITED)。
参考: JuggleIM server-api-quickstart.sh。
文档 OPS-03 灾备页旧服务名
现状: 恢复/回滚页和 release.py pin 仍列 bot-server / im-media-service。运行时已并入 im-core / open-service。
可能的 bug / 代价: 按页 stop 会停不存在的服务或拉错镜像。compose 未知服务名会报错,不是静默。
修复思路: 改名单。不要趁机上备份演练门禁。
已知债 OPS-05 网关钉死单实例、无排空
现状: REALTIME_GATEWAY_EXPECTED_INSTANCE_COUNT=1,内存 session registry,禁止 memory 多实例。滚动踢全部套接字。八单元文档写成最根本的债。
可能的 bug / 代价: 每次发网关,全员掉线再重连。不是「高可用没抄好」,是连接平面还没做。
修复思路: 独立连接平面项目(注册表外置、排空、再谈 N=3)。不要从 Tinode cluster.yml 直接抄进现在的单例网关。
参考: Tinode 三节点 + 少数派拒写;OpenIM 全网关广播不依赖粘滞。
已知债 OPS-06 跨节点默认关,好友投递账本在本地盘
现状: CROSS_NODE 默认 false。好友投递 ledger 在节点本地卷。只 restore Mongo 不还该卷会分裂。
可能的 bug / 代价: 多网关时投递账对不上。灾备漏卷。
修复思路: 跟 OPS-05 一起。备份命令已提到该卷,恢复清单要写进同一时间戳。
拍板 OPS-07 Redis 从库挂则不能写
现状: min-replicas-to-write 1 + 热私聊耐久副本。从库挂 → NOREPLICAS,全站写拒绝。有专门降级 runbook。
可能的 bug / 代价: 用耐久买来的「一挂全挂」。设计如此,不是漏配。
修复思路: 保持则演练 runbook;若要可写降级,必须和 IMCORE_HOT_PRIVATE_DURABILITY_REPLICAS 一起改,并接受可见消息可能丢从库副本。
参考: docs/operations/redis-replica-failure-degradation-runbook.md。
合同 OPS-08 无多活、无演练 restore
现状: 对外页已写:单机 Mongo/Redis/Rabbit、单副本应用;跨区/多活/零停机/备份演练未验证。备份是命令骨架,无 cron、无演练门禁。
可能的 bug / 代价: 机房故障没有第二写站点。不是文档撒谎,是能力没有。
修复思路: 继续对外诚实。不要为了对照 Turms README 上「多活」去堆假集群。
参考: Rocket.Chat 从第一天 Mongo 副本集(可单成员)当踏脚石;没人给过演练收据。
交付 OPS-09 不交镜像、客户自建 8 张
现状: 官方交付 Flutter pub + Maven jar。deploy-v* 无镜像层。这是 2026-08-11 已拍板。
可能的 bug / 代价: 接入重。不是缺陷,是交付形态。列在这里以免对照时被说成「漏了 Docker 官方镜像」。
修复思路: 不改除非重新拍板交付面。
别人牛逼、我们能不能吃
下面只列对照里别人明显强、且我们还没对等或只做了一半的。我们已经强过对方的(指纹幂等、发送出箱、设备 ACK 账本、粘性超级群、邀请不发 UserSig、接听设备 CAS、会议转交/空房截止)不重复报喜。能吃的给到清单 ID;不能吃的写清为什么——不是对方不强。
| 别人强在 | 谁 | 我们现在 | 能不能吃 |
|---|---|---|---|
| 先落库再回 seq,ack 就是「行在」 | Tinode;Turms persist=true;我们 MQ06 | MQ01 回 VISIBLE 时 Mongo 可能还没有 | 能:MSG-04。不要退成 OpenIM「ack=入队」 |
| 振铃中再来一路是忙,不拆旧铃 | JuggleIM grab | 先 CAS 成 REPLACED 再占坑 | 能:RTC-01。只偷「别拆铃」,不偷 Incoming 不算忙、不偷邀请就发证 |
| 先写入收件箱序号,再 QoS0 通知,对端再拉 | 野火 | 私聊/普通群推全文;空会话无 ledger | 能:MSG-07。先用在多端/未打开,不要再抄一套全网关推全文 |
| 连接后取全部会话 maxSeq,按区间把洞拉齐 | OpenIM SDK | 重连每会话一页,打开才 drain | 思路能吃,合同不能直接吃:MSG-03 先改 Q031 再立项 |
| 仓内脚本:互加 → 发一条 → 断言成功 | JuggleIM quickstart.sh | 首页「5 分钟」+ 漏好友门 + 关链报限流 | 能:OPS-02,跟 X-01 一单 |
| 就绪探针不是聚合 health | Rocket.Chat /readyz | readiness 分组已做对,发布闸还打聚合 | 能:OPS-04。别上整套监控产线 |
| 单实例就能发出第一条;集群是加法 | Tinode / 野火 / Juggle 社区 | 默认八单元+关旗,评估形态不是官方首条路径 | 能吃姿势,不能拆生产 SKU:OPS-01 拍板 embed profile |
| 发送方其他端实时看见自己刚发的 | OpenIM IsSenderSync;野火 exceptClientId | 群扇出减发送方,第二台靠以后 sync | 能:MSG-08。单独回推,别把发送方塞进收件人集合 |
| 挂断原因是可推送/可入话单的闭集 | 野火 CallStart.status 0–8 | 人手挂 COMPLETED,心跳死亡 DISCONNECTED,词表塌缩 | 能,纯改进。随 RTC-02 终态管线收口,别单独开引擎 |
| 通话记录是可替换的那条会话气泡 | Tinode 同一条 {data} 改头 | 有卡片,记录与状态可能分叉 | 能,文档/卡片级。别新做一套历史模型 |
| 接听才发媒体票 | 我们已有;Juggle 邀请就 GenerateAuth | 邀请 mediaReady=false | 我们已经更好。不要抄 Juggle 邀请发证 |
| 最后一名发布者消失必须拆房 | 对照原则;会议我们已做 | 直播 repairPresence 只 markLeft | 能:RTC-04 政策单,对齐自己的会议空房截止 |
| 系统来电 PushKit / 独立 VoIP | 野火 | 没有 | 能,但是产品里程碑 RTC-10,不是「吸收 IM 引擎」 |
| 连接面 N=3、少数派拒写、不靠粘滞 | Tinode cluster;OpenIM 全网关广播 | 网关钉死 1,滚动全掉线 | 能吃方向:OPS-05。现在抄 compose 三副本是假集群 |
| 中途加参与者(406) | 野火 | 没有 | 能,下阶段会控。本批状态机没做完别加 |
| 大群延迟/关 inbox/关推送阀门 | JuggleIM | 我们是换线路(超级群水位),不丢已 ack 的扇出 | 不要吃丢消息那几档。我们的换线路更对 |
| 社区单机 / 专业版集群写在脸上 | 野火、Juggle | 对外已写单机、未验证多活 | 文档姿势已对齐。别为了「像开源」去堆 replicas:2 |
| 钉死版本、拒绝 latest、滚动一次一个 | Rocket.Chat RELEASE= | 组件 tag 必须在 main;镜像客户自建 | 发布线已有。客户镜像钉 digest 写进交付说明即可,别新造产线 |
| 预约会议错误码拆开(取消/过期/未开始/错密码) | Turms | 会议状态机已很完整,错误码要对照时再核,不在此编 | 不单开。下次改会议 API 时对一下表 |
| Webhook 发送前后钩子 | OpenIM | 开放平台/内部回放另有合同 | 不从这次对照单开。别为了对齐再做一套 |
一句话:该吃的几乎都已经落在上面的问题清单里(偷铃、关链码、确认未知、探针、空 LIVE、可见 vs 落库、通知再拉、发送方多端、首条路径、连接平面)。另外还能小吃的只有「挂断原因闭集」和「通话气泡与状态别分叉」。对方更强但我们不该吃的,是入队 ack、假成功、大群丢扇出、邀请即发证、共享卷副本数。
对照里出现、不要做成那样
这些不是「我们没问题」,是别家的做法会引进新问题。问题本身若上面已列,修的时候不要抄这一列。
- OpenIM:发送成功=入队、回执无 Seq → 超时同 ClientMsgID 双序号。我们 MQ01 已把 seq 绑在 prepare,退回去是退步。
- JuggleIM Silent:SUCCESS + seq=0 不落库 → 假成功。不要学。
- JuggleIM / 野火:进程 LRU 或无 client id → 换节点双发。
- 野火撤回后再 insertUserMessages → 同一 mid 新个人序号。我们已是原地 markRecalled。
- HuLa:ICE disconnected 当致命立刻挂。
- Tinode hello 下发静态 TURN 密码。
- Turms webhook 类型不安全、健康接口静态 UP。
- OpenIM k8s replicas:2 共享一张 PVC → 不是仲裁。
- 付费 Janus / ZK 集群 / Enterprise 表 → 闭源页,不是可抄实现。