Repository navigation
fix(online): 在线总览五路查询并发化并将聚合谓词下推存储层 - #820
Conversation
OnlineOverviewService.ReviewAsync 由依次 await 全量拉取改为六路存储聚合读 Task.WhenAll 并发执行,总延迟取最大者;五个存储接口新增作用域内聚合读方法 (Presence 在线计数、Session/Party/Match 按状态分组计数、MatchTicket 按 (Mode,Region) 槽位的队列深度+等待秒合计与吞吐窗口票据计数,新 DTO OnlineMatchQueueSlotAggregate),统计口径不变、集中在服务类文档,谓词随 契约下推存储层,服务层不再消费全量行;InMemory 实现为锁内扫描不产出实体 副本,结果与原内存聚合逐字段等价(既有总览测试全绿)。 Linear: GFX-1093
|
No actionable comments were generated in the recent review.
|
| Layer / File(s) | Summary |
|---|---|
作用域状态分布统计 Capability/GameFrameX.Capability.Online.Foundation/Presence/*、Capability/GameFrameX.Capability.Online.Foundation/Session/*、Capability/GameFrameX.Capability.Online.Match/IOnlineMatchActorStore.cs、Capability/GameFrameX.Capability.Online.Match/InMemoryOnlineMatchActorStore.cs、Capability/GameFrameX.Capability.Online.Matchmaking/Party/* |
新增按租户、应用和区服统计在线玩家、非终态会话、非终态队伍及活跃对局的方法。存储实现按对应状态规则过滤和分组。 |
匹配队列槽位聚合 Capability/GameFrameX.Capability.Online.Matchmaking/IOnlineMatchTicketStore.cs、Capability/GameFrameX.Capability.Online.Matchmaking/InMemoryOnlineMatchTicketStore.cs、Capability/GameFrameX.Capability.Online.Matchmaking/OnlineMatchQueueSlotAggregate.cs |
新增按 (Mode, Region) 聚合排队票据的队列深度和等待时长,以及统计时间窗内分配所消耗票据数的方法。 |
总览服务并发读取 Capability/GameFrameX.Capability.Online.Operations/Overview/OnlineOverviewService.cs |
ReviewAsync 并发调用六个存储聚合查询,并将状态分布和队列聚合结果合并到快照。吞吐统计使用左开右闭的最近 60 秒时间窗。 |
Priority:
Estimated code review effort: 3 (Moderate) | ~25 minutes
Change: Bug fix
Sequence Diagram(s)
sequenceDiagram
participant Overview as OnlineOverviewService
participant Presence as IOnlinePresenceStore
participant Session as IOnlineSessionStore
participant Party as IOnlinePartyStore
participant Match as IOnlineMatchActorStore
participant Tickets as IOnlineMatchTicketStore
par 并发读取在线玩家数
Overview->>Presence: CountOnlineByServerAsync
Presence-->>Overview: 在线玩家数
and 并发读取会话状态分布
Overview->>Session: CountNonTerminalByScopeAsync
Session-->>Overview: 会话状态分布
and 并发读取队伍状态分布
Overview->>Party: CountNonTerminalByScopeAsync
Party-->>Overview: 队伍状态分布
and 并发读取活跃对局状态分布
Overview->>Match: CountActiveByScopeAsync
Match-->>Overview: 对局状态分布
and 并发读取排队聚合
Overview->>Tickets: AggregateQueuedBySlotAsync
Tickets-->>Overview: 队列深度和等待时长
and 并发读取分配票据聚合
Overview->>Tickets: CountAssignmentTicketsBySlotAsync
Tickets-->>Overview: 分配票据数
end
Overview->>Overview: 合并聚合结果并填充快照
Possibly related PRs
- GameFrameX/GameFrameX.Server.Source#806:该 PR 实现了
IOnlineSessionStore。本次新增的接口方法要求该实现满足新的存储契约。
Merge Risk: 
Minimal · up to 5e77a
-
The aggregation changes are mergeable after normal checks; no issue requiring a pre-merge fix was established.
Pre-merge checks: 
5
-
Full details: Linked Issues check
-
Explanation
[
#721] 直接关联 issue 的编码要求有两项:(1) 并发执行查询;(2) 将聚合下推到存储层,且只返回聚合所需数据。证据:
- 要求 (1):已满足。
OnlineOverviewService.ReviewAsync(head)创建六个存储聚合任务,并通过Task.WhenAll并发等待。总延迟取最大值,不再是各查询之和。 - 要求 (2):已满足。以下接口新增聚合方法:
IOnlinePresenceStore.CountOnlineByServerAsync、IOnlineSessionStore.CountNonTerminalByScopeAsync、IOnlinePartyStore.CountNonTerminalByScopeAsync、IOnlineMatchActorStore.CountActiveByScopeAsync、IOnlineMatchTicketStore.AggregateQueuedBySlotAsync与CountAssignmentTicketsBySlotAsync。各方法在存储侧完成过滤与计数(InMemory 实现在全局锁内扫描)。服务层只消费计数或OnlineMatchQueueSlotAggregate聚合行,不再读取全量实体行。 - 聚合结果由服务层推导:会话数与重连率来自状态分布;平均等待由
TotalWaitSeconds / TicketCount计算。这与 issue 所述的 COUNT/SUM 需求一致。
差异说明(不构成未满足要求):
- issue 描述五个查询。PR 实际并发六路,吞吐窗口(最近 60 秒分配票据数)为独立一路。issue 未禁止增加查询,其核心要求是并发与下推。
- issue 举例列出 COUNT/SUM/MAX。当前实现未使用 MAX。总览快照的字段清单中未见需要 MAX 的指标,因此不视为缺失。
测试:issue 未要求新增自动化测试,因此测试不作为本次判定条件。PR 仅声明既有总览测试通过,未给出测试名称。
不确定性:仅在变更文件摘要中见到 InMemory 实现。
Capability/GameFrameX.Capability.Online.Matchmaking目录列表中仅见 InMemory 实现。其他目录中是否存在这些接口的其他存储实现,本次无法完整核实。计算结果与旧版内存聚合等价的说法,也未由测试证据直接证明。 - 要求 (1):已满足。
Full details: Out of Scope Changes check
-
Explanation
变更集中于在线总览的聚合读取路径,与
#721的范围一致。逐项说明:
OnlineOverviewService:改为并发聚合读取,并删除全量列表扫描与队列累加辅助逻辑。该部分直接实现#721。- 五个存储接口及对应 InMemory 实现:新增聚合方法。它们是存储侧下推的必要组成部分。
OnlineMatchQueueSlotAggregate:新增 DTO,用于承载队列深度、等待秒数与吞吐计数。它是票据聚合接口的返回类型,属于实现所需。- 服务文档注释:补充统计口径与六路并发说明。该变更描述实现行为,属于同一改动的一部分。
未见与
#721无关的功能变更。吞吐窗口、在线玩家数、会话数、队伍数、对局数与队列概况均为既有总览指标。本次改动只改变其取数方式,未见新增无关指标。限制:判定依据为变更文件摘要与 head 上的
OnlineOverviewService.cs源码。未对每个 InMemory 聚合实现逐行核对。
Full details: Docstring Coverage
-
Explanation
Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 18 functions across 12 files.
-
Finishing Touches
-
📝 Generate docstrings
-
- Commit to this branch
- Create a new PR
🧪 Generate unit tests (beta)
-
- Commit to this branch
- Create a new PR
-
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
Comment @coderabbitai help to get the list of available commands.
|



Fixes GFX-1093
Closes #721
Summary by CodeRabbit