第 24 章把「对局」升级为「赛事」。一局对战的胜负很好判定,但把它放进单败淘汰树、瑞士制轮次或跨时区积分联赛后,问题立刻变成调度问题:什么时候排谁打谁、有人不来怎么办、跨时区怎么对齐、积分怎么算才不重不漏。这一章给出的答案是状态机加任务队列:赛事、阶段、对阵表与单场对局各自有状态流转,所有推进动作以幂等任务的形式经 Job Queue 执行,并用事务外发保证事件不丢。
本章定位
- 全集位置:第 24 章,属「赛事与竞技」层,是跨服对战之上的组织层。
- 难度梯度:高阶。五种赛制的数据结构差异加上跨时区排程与结算幂等,复杂度集中。
- 前置章节:第 20 章社交大厅(身份与房间目录),并依赖第 23 章跨服战提供的对战调度能力。
- 后续衔接:第 41 章 AI 自适应平衡系统从赛事数据中提取平衡性信号,第 37 章战斗录像与分析系统则提供回放素材。
核心验证目标
- 多赛制支持:循环赛、瑞士制、单败与双败淘汰、积分联赛、天梯排名制,共用同一套赛事与阶段模型。
- 自动赛程调度:动态时区匹配、跨区房间分配、异常重排与补赛、超时与弃权判定。
- 积分与排名:Elo 与 Glicko-2 动态积分、积分制与净胜分制、破同规则、排名快照。
- 一致性保障:任务队列加事务外发保证事件不丢,幂等键防重复执行,异常时通过状态修复回到一致。
- 领域建模:赛事、阶段、对阵表、对局、参赛者、积分榜、任务、时间槽与规则集九类核心实体关系清晰。
- 可观测与运维:任务执行监控与延迟指标、赛程执行 SLA、自动预警与重试。
技术栈建议
| 层次 | 推荐选型 | 说明 |
|---|---|---|
| 服务端 | Go、Java 或 Rust | 赛事域、调度域与积分域可分离 |
| 协议 | HTTP 加 WebSocket | HTTP 承载报名与查询,WebSocket 推送赛程与比分 |
| 调度 | JobQueue 加 EventBus | 依赖 Redis 或 Kafka 实现任务与事件 |
| 一致性 | 事务外发加幂等键 | 保证积分结算不重不漏 |
| 时间 | 跨时区统一时钟 | 以 UTC 存储,按玩家时区展示 |
本章文章
| 文章 | 核心内容 |
|---|---|
| 在线联机原型全集:第 24 章 动态赛事系统(Dynamic Tournament System) | 实时事件驱动、自动调度、排名积分系统、多赛制支持、跨时区排程与积分结算一致性 |
与相邻章节的关系
- 上一章:第 23 章 跨服战系统 提供跨区对战能力,本章在其上组织赛程与积分。
- 下一章:第 25 章 市场系统 从竞技组织转向经济组织,但同样依赖任务队列与幂等结算。
- 数据下游:第 37 章 战斗录像与分析系统 与 第 41 章 AI 自适应平衡系统 消费赛事产生的大量对局数据。