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:
27
src/index.js
27
src/index.js
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user