Files
open-im-server-deploy/docs/troubleshooting.md
kim.dev.6789 e50142a3b9 复制项目
2026-01-14 22:16:44 +08:00

4.8 KiB
Raw Blame History

OpenIM ACK 排障流程(标准化指南)

目标:在 ACK/Kubernetes 环境下定位“消息不同步/推送缓慢”时,有一套可复用的排障步骤,避免因为主观猜测去改底层逻辑。


1. 明确现象与影响范围

  • 收集信息受影响的用户、群组、时间段、终端类型iOS/Android/H5
  • 区分场景:登录拉取历史 vs. 实时推送,是否所有人都不行、还是个别用户/群。
  • 保存日志与报错:客户端/服务端的时间点,便于与服务端日志对应。

不要在未复现/未收集信息的情况下就进行代码改动。


2. 逐层排查流程

2.1 API 层openim-api

  1. 查看 kubectl logs deploy/openim-api,确认登录/发消息请求是否返回 200。
  2. 如出现 token invalidrpc timeout 等明确错误,先排除配置、网络等问题。

2.2 RPC 层openim-rpc-xxx

  1. 针对消息问题,重点查看 openim-rpc-msgopenim-rpc-group 等服务日志。
  2. 出现 MsgToMongoMQ errorredis set failed 等,说明生产端异常,需要先修复 RPC/存储配置。

2.3 Kafka & 消费端

  1. 使用 kubectl logs deploy/openim-msgtransferdeploy/push-rpc-server,查看是否有:
    • xxxConsumer err, will retry in 5 seconds(真正的连不上 Kafka
    • Subscribe returned normally...正常现象,新版 SDK 每条消息都会返回一次)。
  2. 如怀疑 Kafka 累计延迟,可登录 Kafka 集群或使用 kafka-consumer-groups.sh --describe 查看 Lag。

2.4 持久化Mongo / Redis

  1. 抽取异常消息的 conversationId & seq直接在 Mongo/Redis 中查询是否存在。
  2. 若 Redis 缺失最新 seq说明 msgtransfer 未写入;继续回头查消费日志。

2.5 推送服务push与网关msggateway

  1. kubectl logs deploy/push-rpc-server:关注推送 RPC 的失败/超时日志;
  2. kubectl logs deploy/messagegateway-rpc-server:观察是否大量 write: broken pipe(通常是客户端断线,非服务异常);
  3. 确认 openim-push 是否因为配置(厂商证书、推送速率限制)导致卡住。

2.6 客户端侧验证

  • 使用不同终端iOS/Android/H5交叉验证
  • 检查客户端本地缓存/seq 是否有延迟;必要时抓包或查看客户端日志。

3. 变更前的对照与验证

  • 先查证:如果怀疑配置/逻辑问题,先在官方仓库(upstream/main)对比差异,确认是否确实存在 bug。
  • 最小化修改:优先通过配置/运维手段解决(如重启 Pod、更新镜像、修复 Kafka 集群);代码层改动需:
    1. 写清楚“问题现象 → 复现步骤 → 根因分析 → 预期影响”;
    2. 在测试环境复盘,多人同行评审;
    3. 修改后 mage build + kubectl rollout 验证,确保上下游联调通过。
  • 禁止“先改再说”:避免仅凭几行日志或猜测就改动核心组件(如 discovery、在线推送、MQ 消费),否则容易引入新的系统风险。

4. 常见误区与经验

  • “Subscribe returned normally” ≠ 错误:新版本 NewMConsumerGroupV2 每处理一条消息就会返回,外层循环需要继续 Subscribe
  • ACK Pod 重建是常态:官方推荐使用 Service DNS/Headless Service + readiness/liveness不要擅自关闭连接。
  • 推送失败不等于刷新连接:先确认网关/客户端状态,只有在明确连接池崩溃时才考虑 ForceRefresh
  • go mod tidy 的影响:在本地执行 go mod tidy 可能引入上游依赖CI/build 失败时先恢复 go.mod/go.sum

5. 工具清单

  • kubectl logs/get/describe:查看 Pod/Deployment 状态;
    • kubectl top pods -n <ns>:实时查看 Pod CPU / MEM
    • kubectl top nodes:评估集群整体资源是否紧张;
    • kubectl top node <name>:关注某台节点是否 CPU / MEM / LOAD 异常;
  • kubectl rollout status deployment/<name>:确认升级完成;
  • mage build:本地编译检查;
  • Kafka CLI 或监控平台:定位消费滞后;
  • Prometheus/Grafana查看服务 CPU、内存、QPS、错误率、延迟等指标
  • 日志聚合ELK / Loki 等):快速检索关键字;
  • SSH 到节点(需要权限):
    • top / htop:查看 CPU、内存占用
    • free -h:系统整体内存状况;
    • df -h:磁盘容量,防止磁盘打满影响容器;
    • du -sh /var/lib/docker, /var/log 等目录,确认是否存在异常增长。

6. 复盘与持续改进

  1. 每次重大故障后,输出“故障记录 + 根因 + 修复方案 + 预防措施”。
  2. 同步更新此文档或内部 Wiki确保新同学也能快速掌握流程。
  3. 定期与官方版本对齐,避免长期“漂移”导致的隐藏问题。

若有新的场景/问题,请在这里补充,保持流程可演进。