rwadurian/backend/services/blockchain-service/src/infrastructure
hailin 7ee6d633c6 fix(kafka): 修复 MPC Kafka consumer 启动订阅失败后不重试的问题
问题现象:
- 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>
2026-02-02 19:18:10 -08:00
..
blockchain feat(blockchain): 1.0 blockchain-service 同步添加 RPC 端点自动故障转移 2026-02-01 07:36:02 -08:00
kafka fix(kafka): 修复 MPC Kafka consumer 启动订阅失败后不重试的问题 2026-02-02 19:18:10 -08:00
mpc feat(mpc): 将 blockchain-service MPC 签名从 HTTP 改为 Kafka 事件驱动 2025-12-15 09:45:39 -08:00
persistence fix(blockchain): use amountFormatted to rebuild TokenAmount from DB 2025-12-10 12:22:32 -08:00
redis feat(blockchain): 添加 Redis 缓存自动恢复机制 2025-12-15 23:13:04 -08:00
infrastructure.module.ts feat(blockchain): 将提现转账从私钥签名改为 MPC 签名 2025-12-15 08:04:17 -08:00