@roomkit/worker 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -0
- package/dist/src/admin/admin.controller.d.ts +275 -0
- package/dist/src/admin/admin.controller.d.ts.map +1 -0
- package/dist/src/admin/admin.controller.js +296 -0
- package/dist/src/admin/admin.controller.js.map +1 -0
- package/dist/src/admin/admin.module.d.ts +3 -0
- package/dist/src/admin/admin.module.d.ts.map +1 -0
- package/dist/src/admin/admin.module.js +35 -0
- package/dist/src/admin/admin.module.js.map +1 -0
- package/dist/src/admin/admin.service.d.ts +282 -0
- package/dist/src/admin/admin.service.d.ts.map +1 -0
- package/dist/src/admin/admin.service.js +508 -0
- package/dist/src/admin/admin.service.js.map +1 -0
- package/dist/src/auth/auth.module.d.ts +10 -0
- package/dist/src/auth/auth.module.d.ts.map +1 -0
- package/dist/src/auth/auth.module.js +37 -0
- package/dist/src/auth/auth.module.js.map +1 -0
- package/dist/src/auth/auth.service.d.ts +21 -0
- package/dist/src/auth/auth.service.d.ts.map +1 -0
- package/dist/src/auth/auth.service.js +69 -0
- package/dist/src/auth/auth.service.js.map +1 -0
- package/dist/src/circuit-breaker/circuit-breaker.module.d.ts +3 -0
- package/dist/src/circuit-breaker/circuit-breaker.module.d.ts.map +1 -0
- package/dist/src/circuit-breaker/circuit-breaker.module.js +24 -0
- package/dist/src/circuit-breaker/circuit-breaker.module.js.map +1 -0
- package/dist/src/circuit-breaker/circuit-breaker.service.d.ts +89 -0
- package/dist/src/circuit-breaker/circuit-breaker.service.d.ts.map +1 -0
- package/dist/src/circuit-breaker/circuit-breaker.service.js +207 -0
- package/dist/src/circuit-breaker/circuit-breaker.service.js.map +1 -0
- package/dist/src/config/config.module.d.ts +3 -0
- package/dist/src/config/config.module.d.ts.map +1 -0
- package/dist/src/config/config.module.js +22 -0
- package/dist/src/config/config.module.js.map +1 -0
- package/dist/src/config/config.service.d.ts +19 -0
- package/dist/src/config/config.service.d.ts.map +1 -0
- package/dist/src/config/config.service.js +58 -0
- package/dist/src/config/config.service.js.map +1 -0
- package/dist/src/config/worker.config.d.ts +82 -0
- package/dist/src/config/worker.config.d.ts.map +1 -0
- package/dist/src/config/worker.config.js +35 -0
- package/dist/src/config/worker.config.js.map +1 -0
- package/dist/src/index.d.ts +48 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +108 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lifecycle/graceful-shutdown.service.d.ts +71 -0
- package/dist/src/lifecycle/graceful-shutdown.service.d.ts.map +1 -0
- package/dist/src/lifecycle/graceful-shutdown.service.js +221 -0
- package/dist/src/lifecycle/graceful-shutdown.service.js.map +1 -0
- package/dist/src/lifecycle/index.d.ts +2 -0
- package/dist/src/lifecycle/index.d.ts.map +1 -0
- package/dist/src/lifecycle/index.js +18 -0
- package/dist/src/lifecycle/index.js.map +1 -0
- package/dist/src/main.d.ts +2 -0
- package/dist/src/main.d.ts.map +1 -0
- package/dist/src/main.js +54 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/metrics/metrics.controller.d.ts +15 -0
- package/dist/src/metrics/metrics.controller.d.ts.map +1 -0
- package/dist/src/metrics/metrics.controller.js +44 -0
- package/dist/src/metrics/metrics.controller.js.map +1 -0
- package/dist/src/metrics/metrics.module.d.ts +7 -0
- package/dist/src/metrics/metrics.module.d.ts.map +1 -0
- package/dist/src/metrics/metrics.module.js +28 -0
- package/dist/src/metrics/metrics.module.js.map +1 -0
- package/dist/src/metrics/metrics.service.d.ts +65 -0
- package/dist/src/metrics/metrics.service.d.ts.map +1 -0
- package/dist/src/metrics/metrics.service.js +306 -0
- package/dist/src/metrics/metrics.service.js.map +1 -0
- package/dist/src/migration/migration.module.d.ts +3 -0
- package/dist/src/migration/migration.module.d.ts.map +1 -0
- package/dist/src/migration/migration.module.js +30 -0
- package/dist/src/migration/migration.module.js.map +1 -0
- package/dist/src/migration/migration.service.d.ts +68 -0
- package/dist/src/migration/migration.service.d.ts.map +1 -0
- package/dist/src/migration/migration.service.js +295 -0
- package/dist/src/migration/migration.service.js.map +1 -0
- package/dist/src/migration/room-migration.service.d.ts +92 -0
- package/dist/src/migration/room-migration.service.d.ts.map +1 -0
- package/dist/src/migration/room-migration.service.js +297 -0
- package/dist/src/migration/room-migration.service.js.map +1 -0
- package/dist/src/redis/redis.module.d.ts +3 -0
- package/dist/src/redis/redis.module.d.ts.map +1 -0
- package/dist/src/redis/redis.module.js +22 -0
- package/dist/src/redis/redis.module.js.map +1 -0
- package/dist/src/redis/redis.service.d.ts +68 -0
- package/dist/src/redis/redis.service.d.ts.map +1 -0
- package/dist/src/redis/redis.service.js +260 -0
- package/dist/src/redis/redis.service.js.map +1 -0
- package/dist/src/room/client-proxy.d.ts +43 -0
- package/dist/src/room/client-proxy.d.ts.map +1 -0
- package/dist/src/room/client-proxy.js +91 -0
- package/dist/src/room/client-proxy.js.map +1 -0
- package/dist/src/room/game-room.d.ts +243 -0
- package/dist/src/room/game-room.d.ts.map +1 -0
- package/dist/src/room/game-room.js +434 -0
- package/dist/src/room/game-room.js.map +1 -0
- package/dist/src/room/message-handler.service.d.ts +70 -0
- package/dist/src/room/message-handler.service.d.ts.map +1 -0
- package/dist/src/room/message-handler.service.js +541 -0
- package/dist/src/room/message-handler.service.js.map +1 -0
- package/dist/src/room/room-manager.service.d.ts +132 -0
- package/dist/src/room/room-manager.service.d.ts.map +1 -0
- package/dist/src/room/room-manager.service.js +571 -0
- package/dist/src/room/room-manager.service.js.map +1 -0
- package/dist/src/room/room-persistence.service.d.ts +101 -0
- package/dist/src/room/room-persistence.service.d.ts.map +1 -0
- package/dist/src/room/room-persistence.service.js +307 -0
- package/dist/src/room/room-persistence.service.js.map +1 -0
- package/dist/src/room/room-registry.service.d.ts +16 -0
- package/dist/src/room/room-registry.service.d.ts.map +1 -0
- package/dist/src/room/room-registry.service.js +60 -0
- package/dist/src/room/room-registry.service.js.map +1 -0
- package/dist/src/room/room.module.d.ts +15 -0
- package/dist/src/room/room.module.d.ts.map +1 -0
- package/dist/src/room/room.module.js +55 -0
- package/dist/src/room/room.module.js.map +1 -0
- package/dist/src/room/rooms/echo-room.d.ts +18 -0
- package/dist/src/room/rooms/echo-room.d.ts.map +1 -0
- package/dist/src/room/rooms/echo-room.js +85 -0
- package/dist/src/room/rooms/echo-room.js.map +1 -0
- package/dist/src/room/rooms/index.d.ts +2 -0
- package/dist/src/room/rooms/index.d.ts.map +1 -0
- package/dist/src/room/rooms/index.js +6 -0
- package/dist/src/room/rooms/index.js.map +1 -0
- package/dist/src/worker.module.d.ts +10 -0
- package/dist/src/worker.module.d.ts.map +1 -0
- package/dist/src/worker.module.js +46 -0
- package/dist/src/worker.module.js.map +1 -0
- package/dist/test/circuit-breaker/circuit-breaker.service.spec.d.ts +2 -0
- package/dist/test/circuit-breaker/circuit-breaker.service.spec.d.ts.map +1 -0
- package/dist/test/circuit-breaker/circuit-breaker.service.spec.js +220 -0
- package/dist/test/circuit-breaker/circuit-breaker.service.spec.js.map +1 -0
- package/dist/test/integration/admin-api.spec.d.ts +2 -0
- package/dist/test/integration/admin-api.spec.d.ts.map +1 -0
- package/dist/test/integration/admin-api.spec.js +246 -0
- package/dist/test/integration/admin-api.spec.js.map +1 -0
- package/dist/test/migration/game-room-migration.spec.d.ts +2 -0
- package/dist/test/migration/game-room-migration.spec.d.ts.map +1 -0
- package/dist/test/migration/game-room-migration.spec.js +222 -0
- package/dist/test/migration/game-room-migration.spec.js.map +1 -0
- package/dist/test/room/client-proxy.spec.d.ts +2 -0
- package/dist/test/room/client-proxy.spec.d.ts.map +1 -0
- package/dist/test/room/client-proxy.spec.js +117 -0
- package/dist/test/room/client-proxy.spec.js.map +1 -0
- package/dist/test/room/game-room.spec.d.ts +2 -0
- package/dist/test/room/game-room.spec.d.ts.map +1 -0
- package/dist/test/room/game-room.spec.js +219 -0
- package/dist/test/room/game-room.spec.js.map +1 -0
- package/dist/test/room/room-manager.service.spec.d.ts +2 -0
- package/dist/test/room/room-manager.service.spec.d.ts.map +1 -0
- package/dist/test/room/room-manager.service.spec.js +280 -0
- package/dist/test/room/room-manager.service.spec.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +56 -0
- package/dist/test/setup.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var MigrationService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.MigrationService = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const config_service_1 = require("../config/config.service");
|
|
16
|
+
const redis_service_1 = require("../redis/redis.service");
|
|
17
|
+
const room_manager_service_1 = require("../room/room-manager.service");
|
|
18
|
+
const core_1 = require("@roomkit/core");
|
|
19
|
+
/**
|
|
20
|
+
* 房间迁移服务
|
|
21
|
+
* 负责房间的导出、导入和迁移协调
|
|
22
|
+
*/
|
|
23
|
+
let MigrationService = MigrationService_1 = class MigrationService {
|
|
24
|
+
configService;
|
|
25
|
+
redisService;
|
|
26
|
+
roomManagerService;
|
|
27
|
+
logger = new common_1.Logger(MigrationService_1.name);
|
|
28
|
+
// 正在进行的迁移任务
|
|
29
|
+
activeMigrations = new Map();
|
|
30
|
+
constructor(configService, redisService, roomManagerService) {
|
|
31
|
+
this.configService = configService;
|
|
32
|
+
this.redisService = redisService;
|
|
33
|
+
this.roomManagerService = roomManagerService;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 创建房间快照(迁移出口)
|
|
37
|
+
*/
|
|
38
|
+
async createSnapshot(roomId) {
|
|
39
|
+
const room = this.roomManagerService.getRoom(roomId);
|
|
40
|
+
if (!room) {
|
|
41
|
+
this.logger.warn(`Cannot create snapshot: room ${roomId} not found`);
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
// 通知房间开始迁移
|
|
46
|
+
await room.onMigrationStart();
|
|
47
|
+
// 通知玩家房间正在迁移
|
|
48
|
+
await room.broadcast(core_1.MessageType.MSG_ROOM_MIGRATING, {
|
|
49
|
+
roomId,
|
|
50
|
+
message: 'Room is being migrated',
|
|
51
|
+
});
|
|
52
|
+
// 创建快照
|
|
53
|
+
const snapshot = room.createSnapshot(this.configService.workerId);
|
|
54
|
+
this.logger.log(`Created snapshot for room ${roomId}, players: ${snapshot.players.length}`);
|
|
55
|
+
return snapshot;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
this.logger.error(`Failed to create snapshot for room ${roomId}`, error);
|
|
59
|
+
await room.onMigrationFailed(error instanceof Error ? error.message : 'Unknown error');
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 从快照恢复房间(迁移入口)
|
|
65
|
+
*/
|
|
66
|
+
async restoreFromSnapshot(snapshot) {
|
|
67
|
+
try {
|
|
68
|
+
// 检查是否已存在同ID房间
|
|
69
|
+
if (this.roomManagerService.getRoom(snapshot.roomId)) {
|
|
70
|
+
this.logger.warn(`Room ${snapshot.roomId} already exists, cannot restore`);
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
// 创建新房间实例
|
|
74
|
+
const room = await this.roomManagerService.createRoomFromSnapshot(snapshot);
|
|
75
|
+
if (!room) {
|
|
76
|
+
this.logger.error(`Failed to create room from snapshot: ${snapshot.roomId}`);
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
// 恢复房间状态
|
|
80
|
+
room.restoreFromSnapshot(snapshot);
|
|
81
|
+
// 重建玩家连接代理
|
|
82
|
+
for (const player of snapshot.players) {
|
|
83
|
+
await this.roomManagerService.rebuildClientProxy(room, player.userId, player.gatewayId, player.connectionId, player.playerInfo);
|
|
84
|
+
}
|
|
85
|
+
// 更新 Redis 中的房间映射
|
|
86
|
+
await this.updateRoomMapping(snapshot.roomId);
|
|
87
|
+
// 通知房间迁移完成
|
|
88
|
+
await room.onMigrationComplete();
|
|
89
|
+
// 通知玩家迁移完成
|
|
90
|
+
await room.broadcast(core_1.MessageType.MSG_ROOM_MIGRATION_COMPLETE, {
|
|
91
|
+
roomId: snapshot.roomId,
|
|
92
|
+
newWorkerId: this.configService.workerId,
|
|
93
|
+
});
|
|
94
|
+
this.logger.log(`Successfully restored room ${snapshot.roomId} from snapshot`);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
this.logger.error(`Failed to restore room from snapshot`, error);
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 清理源 Worker 上的房间(迁移完成后调用)
|
|
104
|
+
*/
|
|
105
|
+
async cleanupSourceRoom(roomId) {
|
|
106
|
+
const room = this.roomManagerService.getRoom(roomId);
|
|
107
|
+
if (!room) {
|
|
108
|
+
return true; // 已经不存在
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
// 直接销毁,不通知玩家(玩家已经被迁移)
|
|
112
|
+
room.players.clear();
|
|
113
|
+
await room.dispose();
|
|
114
|
+
this.roomManagerService.removeRoom(roomId);
|
|
115
|
+
this.logger.log(`Cleaned up source room ${roomId} after migration`);
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
this.logger.error(`Failed to cleanup source room ${roomId}`, error);
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 更新 Redis 中的房间映射
|
|
125
|
+
*/
|
|
126
|
+
async updateRoomMapping(roomId) {
|
|
127
|
+
const key = `gf:room:${roomId}:worker`;
|
|
128
|
+
await this.redisService.client.set(key, this.configService.workerId);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* 发起完整迁移流程
|
|
132
|
+
* 这个方法在管理端调用,协调整个迁移过程
|
|
133
|
+
*/
|
|
134
|
+
async inititateMigration(request) {
|
|
135
|
+
const { roomId, sourceWorkerId, targetWorkerId } = request;
|
|
136
|
+
const startTime = Date.now();
|
|
137
|
+
this.activeMigrations.set(roomId, {
|
|
138
|
+
status: 'pending',
|
|
139
|
+
startTime,
|
|
140
|
+
request,
|
|
141
|
+
});
|
|
142
|
+
try {
|
|
143
|
+
// 1. 在源 Worker 创建快照
|
|
144
|
+
this.updateMigrationStatus(roomId, 'snapshotting');
|
|
145
|
+
const snapshot = await this.requestSnapshot(roomId, sourceWorkerId);
|
|
146
|
+
if (!snapshot) {
|
|
147
|
+
throw new Error('Failed to create snapshot on source worker');
|
|
148
|
+
}
|
|
149
|
+
// 2. 传输快照到目标 Worker
|
|
150
|
+
this.updateMigrationStatus(roomId, 'transferring');
|
|
151
|
+
// 3. 在目标 Worker 恢复
|
|
152
|
+
this.updateMigrationStatus(roomId, 'restoring');
|
|
153
|
+
const restored = await this.requestRestore(snapshot, targetWorkerId);
|
|
154
|
+
if (!restored) {
|
|
155
|
+
throw new Error('Failed to restore on target worker');
|
|
156
|
+
}
|
|
157
|
+
// 4. 验证
|
|
158
|
+
this.updateMigrationStatus(roomId, 'verifying');
|
|
159
|
+
// TODO: 可选的验证步骤
|
|
160
|
+
// 5. 清理源 Worker
|
|
161
|
+
await this.requestCleanup(roomId, sourceWorkerId);
|
|
162
|
+
// 完成
|
|
163
|
+
this.updateMigrationStatus(roomId, 'completed');
|
|
164
|
+
const migrationTime = Date.now() - startTime;
|
|
165
|
+
this.logger.log(`Migration completed for room ${roomId} in ${migrationTime}ms`);
|
|
166
|
+
return {
|
|
167
|
+
success: true,
|
|
168
|
+
roomId,
|
|
169
|
+
sourceWorkerId,
|
|
170
|
+
targetWorkerId,
|
|
171
|
+
migrationTime,
|
|
172
|
+
status: 'completed',
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
this.updateMigrationStatus(roomId, 'failed');
|
|
177
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
178
|
+
this.logger.error(`Migration failed for room ${roomId}: ${errorMessage}`);
|
|
179
|
+
return {
|
|
180
|
+
success: false,
|
|
181
|
+
roomId,
|
|
182
|
+
sourceWorkerId,
|
|
183
|
+
targetWorkerId,
|
|
184
|
+
error: errorMessage,
|
|
185
|
+
status: 'failed',
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
this.activeMigrations.delete(roomId);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* 更新迁移状态
|
|
194
|
+
*/
|
|
195
|
+
updateMigrationStatus(roomId, status) {
|
|
196
|
+
const migration = this.activeMigrations.get(roomId);
|
|
197
|
+
if (migration) {
|
|
198
|
+
migration.status = status;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* 通过 Redis 向源 Worker 请求快照
|
|
203
|
+
*/
|
|
204
|
+
async requestSnapshot(roomId, workerId) {
|
|
205
|
+
// 发送创建快照命令
|
|
206
|
+
const channel = `gf:rpc:worker:${workerId}`;
|
|
207
|
+
const requestId = `snapshot:${roomId}:${Date.now()}`;
|
|
208
|
+
const message = JSON.stringify({
|
|
209
|
+
type: 'migration:snapshot',
|
|
210
|
+
requestId,
|
|
211
|
+
roomId,
|
|
212
|
+
});
|
|
213
|
+
// 等待响应
|
|
214
|
+
const responseKey = `gf:migration:response:${requestId}`;
|
|
215
|
+
await this.redisService.client.publish(channel, message);
|
|
216
|
+
// 轮询等待响应(最多等待 30 秒)
|
|
217
|
+
const timeout = 30000;
|
|
218
|
+
const startTime = Date.now();
|
|
219
|
+
while (Date.now() - startTime < timeout) {
|
|
220
|
+
const response = await this.redisService.client.get(responseKey);
|
|
221
|
+
if (response) {
|
|
222
|
+
await this.redisService.client.del(responseKey);
|
|
223
|
+
const parsed = JSON.parse(response);
|
|
224
|
+
return parsed.snapshot || null;
|
|
225
|
+
}
|
|
226
|
+
await this.sleep(100);
|
|
227
|
+
}
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* 通过 Redis 向目标 Worker 请求恢复
|
|
232
|
+
*/
|
|
233
|
+
async requestRestore(snapshot, workerId) {
|
|
234
|
+
const channel = `gf:rpc:worker:${workerId}`;
|
|
235
|
+
const requestId = `restore:${snapshot.roomId}:${Date.now()}`;
|
|
236
|
+
const message = JSON.stringify({
|
|
237
|
+
type: 'migration:restore',
|
|
238
|
+
requestId,
|
|
239
|
+
snapshot,
|
|
240
|
+
});
|
|
241
|
+
const responseKey = `gf:migration:response:${requestId}`;
|
|
242
|
+
await this.redisService.client.publish(channel, message);
|
|
243
|
+
// 轮询等待响应
|
|
244
|
+
const timeout = 30000;
|
|
245
|
+
const startTime = Date.now();
|
|
246
|
+
while (Date.now() - startTime < timeout) {
|
|
247
|
+
const response = await this.redisService.client.get(responseKey);
|
|
248
|
+
if (response) {
|
|
249
|
+
await this.redisService.client.del(responseKey);
|
|
250
|
+
const parsed = JSON.parse(response);
|
|
251
|
+
return parsed.success === true;
|
|
252
|
+
}
|
|
253
|
+
await this.sleep(100);
|
|
254
|
+
}
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* 请求清理源 Worker 上的房间
|
|
259
|
+
*/
|
|
260
|
+
async requestCleanup(roomId, workerId) {
|
|
261
|
+
const channel = `gf:rpc:worker:${workerId}`;
|
|
262
|
+
const message = JSON.stringify({
|
|
263
|
+
type: 'migration:cleanup',
|
|
264
|
+
roomId,
|
|
265
|
+
});
|
|
266
|
+
await this.redisService.client.publish(channel, message);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* 获取当前迁移状态
|
|
270
|
+
*/
|
|
271
|
+
getMigrationStatus(roomId) {
|
|
272
|
+
const migration = this.activeMigrations.get(roomId);
|
|
273
|
+
return migration?.status || null;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* 获取所有活跃迁移
|
|
277
|
+
*/
|
|
278
|
+
getActiveMigrations() {
|
|
279
|
+
return Array.from(this.activeMigrations.entries()).map(([roomId, data]) => ({
|
|
280
|
+
roomId,
|
|
281
|
+
...data,
|
|
282
|
+
}));
|
|
283
|
+
}
|
|
284
|
+
sleep(ms) {
|
|
285
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
exports.MigrationService = MigrationService;
|
|
289
|
+
exports.MigrationService = MigrationService = MigrationService_1 = __decorate([
|
|
290
|
+
(0, common_1.Injectable)(),
|
|
291
|
+
__metadata("design:paramtypes", [config_service_1.ConfigService,
|
|
292
|
+
redis_service_1.RedisService,
|
|
293
|
+
room_manager_service_1.RoomManagerService])
|
|
294
|
+
], MigrationService);
|
|
295
|
+
//# sourceMappingURL=migration.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.service.js","sourceRoot":"","sources":["../../../src/migration/migration.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 房间迁移服务
|
|
3
|
+
*
|
|
4
|
+
* 功能:
|
|
5
|
+
* 1. 主动迁移:Worker 主动将房间迁移到另一个 Worker
|
|
6
|
+
* 2. 被动接管:Worker 故障时,其他 Worker 接管孤儿房间
|
|
7
|
+
* 3. 迁移协调:确保迁移过程中的数据一致性
|
|
8
|
+
* 4. 路由更新:通知 Gateway 更新房间路由
|
|
9
|
+
*
|
|
10
|
+
* 设计:
|
|
11
|
+
* - 迁移过程:暂停房间 → 保存快照 → 通知 Gateway → 新 Worker 加载 → 确认完成
|
|
12
|
+
* - 容错机制:超时重试、回滚、失败通知
|
|
13
|
+
*/
|
|
14
|
+
import { RedisService } from '../redis/redis.service.js';
|
|
15
|
+
import { ConfigService } from '../config/config.service.js';
|
|
16
|
+
import { RoomPersistenceService } from '../room/room-persistence.service.js';
|
|
17
|
+
import type { RoomManagerService } from '../room/room-manager.service.js';
|
|
18
|
+
export interface MigrationRequest {
|
|
19
|
+
roomId: string;
|
|
20
|
+
sourceWorkerId: string;
|
|
21
|
+
targetWorkerId: string;
|
|
22
|
+
reason: 'manual' | 'load-balance' | 'shutdown';
|
|
23
|
+
timestamp: number;
|
|
24
|
+
}
|
|
25
|
+
export interface MigrationResult {
|
|
26
|
+
success: boolean;
|
|
27
|
+
roomId: string;
|
|
28
|
+
sourceWorkerId: string;
|
|
29
|
+
targetWorkerId?: string;
|
|
30
|
+
error?: string;
|
|
31
|
+
duration: number;
|
|
32
|
+
}
|
|
33
|
+
export interface TakeoverRequest {
|
|
34
|
+
roomId: string;
|
|
35
|
+
originalWorkerId: string;
|
|
36
|
+
reason: 'worker-failed' | 'timeout';
|
|
37
|
+
timestamp: number;
|
|
38
|
+
}
|
|
39
|
+
export declare class RoomMigrationService {
|
|
40
|
+
private readonly redis;
|
|
41
|
+
private readonly config;
|
|
42
|
+
private readonly persistence;
|
|
43
|
+
private readonly logger;
|
|
44
|
+
private migratingRooms;
|
|
45
|
+
private readonly MIGRATION_TIMEOUT;
|
|
46
|
+
constructor(redis: RedisService, config: ConfigService, persistence: RoomPersistenceService);
|
|
47
|
+
/**
|
|
48
|
+
* 设置 RoomManager(避免循环依赖)
|
|
49
|
+
*/
|
|
50
|
+
setRoomManager(roomManager: RoomManagerService): void;
|
|
51
|
+
private roomManager;
|
|
52
|
+
/**
|
|
53
|
+
* 初始化迁移服务
|
|
54
|
+
*/
|
|
55
|
+
initialize(): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* 主动迁移房间到指定 Worker
|
|
58
|
+
*/
|
|
59
|
+
migrateRoom(roomId: string, targetWorkerId: string, reason?: 'manual' | 'load-balance' | 'shutdown'): Promise<MigrationResult>;
|
|
60
|
+
/**
|
|
61
|
+
* 处理迁移请求(作为目标 Worker)
|
|
62
|
+
*/
|
|
63
|
+
private handleMigrationRequest;
|
|
64
|
+
/**
|
|
65
|
+
* 处理接管请求(孤儿房间)
|
|
66
|
+
*/
|
|
67
|
+
private handleTakeoverRequest;
|
|
68
|
+
/**
|
|
69
|
+
* 等待迁移确认
|
|
70
|
+
*/
|
|
71
|
+
private waitForMigrationConfirmation;
|
|
72
|
+
/**
|
|
73
|
+
* 通知 Gateway 更新路由
|
|
74
|
+
*/
|
|
75
|
+
private notifyGatewayRouteChange;
|
|
76
|
+
/**
|
|
77
|
+
* 请求其他 Worker 接管孤儿房间
|
|
78
|
+
*/
|
|
79
|
+
requestTakeover(roomId: string, originalWorkerId: string, reason?: 'worker-failed' | 'timeout'): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* 获取迁移统计
|
|
82
|
+
*/
|
|
83
|
+
getStats(): {
|
|
84
|
+
migratingRooms: number;
|
|
85
|
+
activeRooms: string[];
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* 模块销毁时清理
|
|
89
|
+
*/
|
|
90
|
+
onModuleDestroy(): Promise<void>;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=room-migration.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-migration.service.d.ts","sourceRoot":"","sources":["../../../src/migration/room-migration.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAI7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,QAAQ,GAAG,cAAc,GAAG,UAAU,CAAC;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBACa,oBAAoB;IAU7B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAX9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAGhE,OAAO,CAAC,cAAc,CAAqB;IAG3C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;gBAGxB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,sBAAsB;IAGtD;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI;IAIrD,OAAO,CAAC,WAAW,CAAmC;IAEtD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBjC;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,MAAM,GAAE,QAAQ,GAAG,cAAc,GAAG,UAAqB,GACxD,OAAO,CAAC,eAAe,CAAC;IA+E3B;;OAEG;YACW,sBAAsB;IA4DpC;;OAEG;YACW,qBAAqB;IAoEnC;;OAEG;YACW,4BAA4B;IAiC1C;;OAEG;YACW,wBAAwB;IAatC;;OAEG;IACG,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,MAAM,GAAE,eAAe,GAAG,SAA2B,GACpD,OAAO,CAAC,IAAI,CAAC;IAYhB;;OAEG;IACH,QAAQ,IAAI;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB;IAOD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAIvC"}
|