问题现象: - blockchain-service 启动时 Kafka consumer subscribe() 抛出 "This server does not host this topic-partition" 错误 - 原实现只 try-catch 一次就放弃,consumer 永久失效 - 后续所有 MPC 签名结果都收不到,表现为 signing timeout 300s - 需要手动 docker restart 才能恢复 根因分析: - 服务启动时 Kafka broker 可能尚未完成 topic-partition 分配 (特别是容器编排环境中服务启动顺序不确定) - onModuleInit() 中的 connect/subscribe/run 是一次性调用 - KafkaJS 的 retry 配置只作用于内部操作,不覆盖初始连接流程 修复方案: - 新增 connectWithRetry() 方法:指数退避重试(2s→4s→8s→...→60s) 最多 10 次,总等待约 5 分钟 - 每次重试前断开连接清理状态,避免 KafkaJS 内部状态残留 - 监听 consumer CRASH 事件:当 KafkaJS 不自动重启时(restart=false) 手动触发 connectWithRetry() 重连 - 新增 isShuttingDown 标志:防止 onModuleDestroy 时触发无意义的重连 - 同时修复 blockchain-service 和 identity-service 两个 consumer 影响范围: - blockchain-service: 影响 MPC 签名结果接收(热钱包转账) - identity-service: 影响 MPC 密钥生成结果接收(用户钱包创建) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| .claude | ||
| contracts | ||
| prisma | ||
| scripts | ||
| src | ||
| .dockerignore | ||
| .env.example | ||
| .eslintrc.js | ||
| .gitignore | ||
| .prettierrc | ||
| DEVELOPMENT_GUIDE.md | ||
| Dockerfile | ||
| deploy.sh | ||
| docker-compose.yml | ||
| nest-cli.json | ||
| package-lock.json | ||
| package.json | ||
| tsconfig.json | ||