Files
Web_BLS_Heartbeat_Server/openspec/changes/add-g4-hot-dual-write/tasks.md
XuJiacheng 43fa7505e5 feat: 新增 G4 热表独立双写能力
- 新增配置项以支持旧/新明细表的独立写入开关及目标表名。
- 重构 DatabaseManager,抽象通用批量 COPY 写入内核,支持不同目标表的复用。
- 新增双明细写入编排器,支持旧/新表独立执行、重试及 fallback。
- 调整 HeartbeatProcessor.processBatch(),确保 room_status 独立执行。
- 错误表仅记录新表写入失败,旧表失败不再写入错误表。
- 重新定义消费暂停策略,基于当前启用的关键 sink 判断。
- 补充按 sink 维度的统计项与启动日志。

新增 G4 热表相关的数据库规范与处理逻辑,确保系统在双写模式下的稳定性与可扩展性。
2026-03-09 15:49:12 +08:00

2.1 KiB
Raw Blame History

1. Configuration

  • 1.1 在 src/config/config.js 新增旧/新明细写入开关、目标表名、room_status 独立开关配置
  • 1.2 在 src/config/config.example.js 同步新增对应示例配置

2. Database Layer Refactor

  • 2.1 抽象通用批量 COPY 写入内核 _insertEventsToTarget(events, targetConfig),支持接收目标表名、列清单、日志前缀等参数
  • 2.2 将旧表 insertHeartbeatEvents() 迁移为调用通用内核,保证旧逻辑行为不变
  • 2.3 新增新表 heartbeat.heartbeat_events_g4_hot 的目标配置与列映射
  • 2.4 新增双明细独立编排方法 insertHeartbeatEventsDual(events),按配置分别调用旧/新 writer聚合返回结构化结果

3. Processor Flow Adjustment

  • 3.1 调整 HeartbeatProcessor.processBatch() 调用链:改用 insertHeartbeatEventsDual() 替代原 insertHeartbeatEvents()
  • 3.2 将 upsertRoomStatus() 从"依赖旧表成功"改为"独立执行"——无论旧/新明细开关状态如何,只要 roomStatusEnabled=true 就始终执行
  • 3.3 调整错误表调用:仅将新表 (g4Hot) 失败记录送入 insertHeartbeatEventsErrors(),旧表失败不写错误表

4. Connection & Pause Strategy

  • 4.1 重构消费暂停判定:基于"当前启用的 sink 是否全部连接级不可写",而非单一旧表状态
  • 4.2 区分连接错误与表级错误,避免新表结构问题误触发全局暂停

5. Observability

  • 5.1 在 src/index.js 启动时输出双写配置摘要(旧/新开关状态、目标表名、room_status 开关)
  • 5.2 在 src/stats/statsManager.js 新增按 sink 维度的统计项legacy/g4Hot 成功数、失败数、room_status 成功/失败数)

6. Testing

  • 6.1 补充 databaseManager 双写编排单元测试(仅旧、仅新、双开、双关、交叉失败等场景)
  • 6.2 补充 room_status 独立性断言测试
  • 6.3 补充错误表仅接新表失败的断言测试
  • 6.4 补充/扩展数据库 smoke 验证脚本,覆盖新表写入、分区、索引验证