feat: 添加 G5 独立写入功能

- 新增 G5 数据库连接配置与可关闭的写入开关
- 在现有 legacy/G4 写入成功路径后,追加独立的 G5 写入流程
- G5 使用与 G4 相同的数据结构映射,但不写入 guid,由数据库自生成 int4 guid
- room_status 新增 G5 独立 upsert 写入路径,并保留旧表与 G5 表的独立开关
- 新增 G5 写入统计与启动摘要输出
- 更新 StatsCounters 和 StatsReporter 以支持 G5 统计
- 增加测试覆盖,确保 G5 写入逻辑与 room_status 的独立执行
- 新增 G5 相关数据库表结构 SQL 文件
This commit is contained in:
2026-03-10 16:29:24 +08:00
parent fe76884b27
commit 2f8857f98e
14 changed files with 924 additions and 130 deletions

View File

@@ -12,6 +12,7 @@ class WebBLSHeartbeatServer {
this.kafkaConsumer = null;
this.heartbeatProcessor = null;
this.databaseManager = null;
this.g5DatabaseManager = null;
this.redis = null;
this.consumers = null;
this.stats = new StatsCounters();
@@ -33,12 +34,31 @@ class WebBLSHeartbeatServer {
console.log('数据库连接成功');
await this.redis?.info('数据库连接成功', { module: 'db' });
if (this.config.g5db?.enabled) {
try {
this.g5DatabaseManager = new DatabaseManager({ ...this.config.g5db, maxConnections: 1 });
await this.g5DatabaseManager.connect();
console.log('G5数据库连接成功');
await this.redis?.info('G5数据库连接成功', { module: 'db', table: this.config.g5db?.g5Table });
} catch (error) {
this.g5DatabaseManager = null;
console.warn('G5数据库连接失败已跳过 G5 写入:', error);
await this.redis?.warn('G5数据库连接失败已跳过 G5 写入', {
module: 'db',
table: this.config.g5db?.g5Table,
error: String(error?.message ?? error),
});
}
}
// 打印双写配置摘要
const dbCfg = this.config.db;
const dualWriteSummary = {
legacyHeartbeat: dbCfg.legacyHeartbeatEnabled ? `ON → ${dbCfg.legacyTable}` : 'OFF',
g4HotHeartbeat: dbCfg.g4HotHeartbeatEnabled ? `ON → ${dbCfg.g4HotTable}` : 'OFF',
roomStatus: dbCfg.roomStatusEnabled !== false ? 'ON' : 'OFF',
g5Heartbeat: this.config.g5db?.enabled ? `ON → ${this.config.g5db?.g5Table}` : 'OFF',
roomStatus: dbCfg.roomStatusEnabled !== false ? `ON → ${dbCfg.roomStatusTable}` : 'OFF',
g5RoomStatus: this.config.g5db?.roomStatusEnabled ? `ON → ${this.config.g5db?.roomStatusTable}` : 'OFF',
};
console.log('双写配置摘要:', dualWriteSummary);
await this.redis?.info('双写配置摘要', { module: 'db', ...dualWriteSummary });
@@ -56,6 +76,7 @@ class WebBLSHeartbeatServer {
// 初始化处理器(共享批处理队列)
this.heartbeatProcessor = new HeartbeatProcessor(this.config.processor, this.databaseManager, {
g5DatabaseManager: this.g5DatabaseManager,
redis: this.redis,
stats: this.stats,
onDbOffline: () => {
@@ -114,6 +135,10 @@ class WebBLSHeartbeatServer {
await this.databaseManager.disconnect();
}
if (this.g5DatabaseManager) {
await this.g5DatabaseManager.disconnect();
}
if (this.redis) {
await this.redis.info('BLS心跳接收端已停止', { module: 'app' });
await this.redis.disconnect();