PRD-013 排行榜系统
文档编号:PRD-013
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:SessionServer/Rank.cpp、RecordServer、MiniServer
1. 背景与目标
排行榜用于展示玩家/帮会实力并驱动竞争。当前存在并列名次跳动、跨服榜单延迟、赛季结算重复发奖等问题。本 PRD 统一榜单类型、计分、刷新、并列与结算。
2. 核心规则
2.1 榜单类型
| 榜单 | 维度 | 范围 | 刷新 |
|---|---|---|---|
| 等级榜 | 等级、经验 | 本服 | 实时 |
| 战力榜 | 综合战力 | 本服/跨服 | 5 分钟 |
| 财富榜 | 金币+元宝折算 | 本服 | 每小时 |
| 帮会榜 | 帮会战力/资金 | 本服 | 每小时 |
| 竞技榜 | 天梯积分 | 跨服 | 赛季 |
| 副本榜 | 通关时间 | 本服 | 实时 |
2.2 计分与排序
- 主键排序 + 次键(时间/角色 ID)保证稳定。
- 并列时按达到时间早者优先。
- 榜单只展示前 100 名,自己的排名单独返回。
- 角色改名/转职后榜单同步更新。
2.3 赛季
- 赛季周期 30/90 天,可配置。
- 赛季结束冻结榜单,按名次发奖,邮件发放。
- 新赛季重置积分,保留历史最高排名。
3. 服务端设计
3.1 数据结构
struct RankEntry {
uint64_t role_id;
uint64_t score;
uint64_t tie_breaker; // 达到时间戳
uint32_t rank;
};
struct RankBoard {
uint32_t board_id;
uint32_t season_id;
std::vector<RankEntry> top;
uint64_t update_time;
};
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| C→S | CS_RankQuery | 查询榜单 |
| S→C | SC_RankList | 前 100 + 自己排名 |
| S→C | SC_RankUpdate | 榜单变化推送 |
| S→C | SC_RankSeason | 赛季信息/结算 |
3.3 刷新策略
- 实时榜在数据变化时更新内存 Top N,异步落库。
- 定时榜由定时任务全量重算,避免频繁写库。
- 跨服榜由
MiniServer汇总各服 Top N 后合并。 - 榜单更新加版本号,客户端丢弃旧版本。
3.4 赛季结算
- 结算前 10 分钟停止变更,冻结榜单。
- 按
role_id发奖,幂等键season_id + role_id。 - 发奖失败进入补偿队列,邮件补发。
- 结算后清理旧赛季缓存,保留归档。
4. 客户端设计
- 榜单页签切换,显示前 100、自己排名、刷新时间。
- 自己不在前 100 时固定底部显示。
- 名次前三使用特殊边框/头像框。
- 赛季页显示剩余时间、奖励预览、历史最高。
- 点击玩家可查看信息/加好友/私聊。
5. 配置
Rank.xml:board_id、score_type、refresh_interval、season_days、reward_group、max_entries。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 分数相同 | 按达到时间早者优先 |
| 角色删除 | 下次刷新移除 |
| 跨服延迟 | 显示“数据同步中”,不显示错误排名 |
| 赛季结算时在线 | 邮件发奖,不强制下线 |
| 重复结算 | 幂等,按 season_id 校验 |
| 榜单被刷 | 异常分数告警,人工下榜 |
7. 验收标准
- 各榜单排序、并列、自己排名正确。
- 定时/实时刷新符合配置。
- 跨服榜单合并无重复/遗漏。
- 赛季结算发奖幂等,无重复/漏发。
- 客户端名次与服务端一致。