1.优化websocket中的jackpot.hit
This commit is contained in:
@@ -47,6 +47,8 @@ class GameWebSocketServer
|
|||||||
private static bool $eventBusConsumerStarted = false;
|
private static bool $eventBusConsumerStarted = false;
|
||||||
private static bool $adminSnapshotTickerStarted = false;
|
private static bool $adminSnapshotTickerStarted = false;
|
||||||
private static bool $heartbeatCheckerStarted = false;
|
private static bool $heartbeatCheckerStarted = false;
|
||||||
|
/** @var bool */
|
||||||
|
private static bool $liveStateTickerStarted = false;
|
||||||
|
|
||||||
/** 客户端 60s 内无任何上行报文(含 ping)即被主动断开 */
|
/** 客户端 60s 内无任何上行报文(含 ping)即被主动断开 */
|
||||||
private const HEARTBEAT_IDLE_SECONDS = 60;
|
private const HEARTBEAT_IDLE_SECONDS = 60;
|
||||||
@@ -87,6 +89,7 @@ class GameWebSocketServer
|
|||||||
self::ensureEventBusConsumer();
|
self::ensureEventBusConsumer();
|
||||||
self::ensureAdminLiveSnapshotTicker();
|
self::ensureAdminLiveSnapshotTicker();
|
||||||
self::ensureHeartbeatChecker();
|
self::ensureHeartbeatChecker();
|
||||||
|
self::ensureLiveStateTicker();
|
||||||
|
|
||||||
$queryString = self::extractQueryString($connection, $request);
|
$queryString = self::extractQueryString($connection, $request);
|
||||||
$query = GameWebSocketAuthHelper::parseQueryString($queryString);
|
$query = GameWebSocketAuthHelper::parseQueryString($queryString);
|
||||||
@@ -351,6 +354,33 @@ class GameWebSocketServer
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 兜底:当 gameLiveTicker 未运行/卡死时,WS 进程也能驱动对局推进,避免对局长期卡在派彩中(status=3)。
|
||||||
|
*
|
||||||
|
* - 每秒执行一次 recoverLiveRoundState()(内部:finalizePayoutGrace + tickAutoDraw)
|
||||||
|
* - 幂等且有锁保护,和 gameLiveTicker 并存也不会破坏一致性
|
||||||
|
*/
|
||||||
|
private static function ensureLiveStateTicker(): void
|
||||||
|
{
|
||||||
|
if (self::$liveStateTickerStarted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self::$liveStateTickerStarted = true;
|
||||||
|
|
||||||
|
Timer::add(1, static function (): void {
|
||||||
|
try {
|
||||||
|
GameLiveService::recoverLiveRoundState();
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
Log::channel('ws')->error('live state ticker failed', [
|
||||||
|
'error' => $e->getMessage(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Log::channel('ws')->info('live state ticker started', [
|
||||||
|
'tick_interval_seconds' => 1,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 后台联调:订阅赔率相关主题后立即推送演示帧(库内样例玩家,带 is_test / preview)。
|
* 后台联调:订阅赔率相关主题后立即推送演示帧(库内样例玩家,带 is_test / preview)。
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user