综合实战:棋牌/桌游类服务器(下)
概述
在棋牌服务器(上)的基础上补齐运营与保障能力:好友邀请(拉好友组局)、排行榜(战绩排行)、商城购买(金币/道具)、安全校验(反作弊与风控)、性能压测(容量验证)。五块能力复用前面章节的成熟方案,本篇演示它们在棋牌项目中的落地。
一、好友邀请
1.1 邀请流程
邀请组局流程:
玩家 A 向好友 B 发送邀请(附房间号)
B 收到邀请(在线推送/离线补发)
B 确认 → 加入 A 的房间
B 拒绝/超时 → 邀请失效
实现:
好友列表(见好友系统章节)
邀请消息走聊天/通知通道
邀请带有效期(如 60s,过期自动失效)// 邀请消息
InviteMsg { roomId, inviterId, inviteeId, expireAt }
// B 确认后校验:房间存在、未满、未过期
if (room.canJoin(inviteeId) && now < msg.expireAt) {
room.join(inviteeId);
} else {
return FAIL("邀请已失效或房间不可加入");
}1.2 邀请链路
邀请链路:
大厅 → 好友列表 → 邀请 → 通知 → 加入
断线场景:B 离线 → 离线补发(上线后再提示)
推广入口:
分享房间码(CDK 式短码,见礼包码章节)
好友间组队奖励(防沉迷合规内)二、排行榜
2.1 战绩排行
排行维度(斗地主场景):
胜场榜:累计胜场数(总榜 + 周榜)
积分榜:段位积分(实时浮动)
财富榜:金币持有量
实现(Redis SortedSet):
胜场:ZINCRBY leaderboard:win {playerId} 1
积分:对局结算后 ZADD 更新
分段:日/周/月 Key(见排行榜章节)// 结算后更新排行
redis.zadd("rank:score:week", score, playerId);
redis.zadd("rank:win:total", 1, playerId); // ZINCRBY 累计
// 查询 Top100(ZREVRANGE)
List top = redis.zrevrange("rank:score:week", 0, 99); // 玩家 ID 列表2.2 榜单缓存与展示
榜单缓存:
全服榜 → 缓存 30s(避免高频查 Redis)
玩家自己的名次 → 缓存 + 定期刷新
周榜结算 → 周日晚锁榜发奖(见活动章节)
展示:
进入大厅拉取 Top 榜单
结算页展示本次对局排名变化三、商城购买
3.1 商品与购买
商城商品(斗地主场景):
金币包(直购/月卡)
道具(记牌器、表情)
皮肤(牌桌皮肤、头像框)
购买流程(见商城章节):
下单(创建订单)→ 支付(渠道回调)→ 发货
幂等:订单号唯一索引
限购:每日/每周限购(Redis 计数)// 购买流程核心
1. 客户端提交 goodsId(服务器查价格)
2. 创建订单(订单状态 CREATED)
3. 支付渠道回调 → 验签 → 订单标记 PAID
4. 发货(货币/道具 + bizId 幂等)
5. 通知玩家(在线推送)3.2 订单与发货
订单状态机:
CREATED → PAYING → PAID → DELIVERED
支付超时 → CLOSED
支付成功但发货失败 → 补偿任务重发
对账:
每日对账(渠道流水 vs 本地订单)
异常订单人工处理(GM 后台)四、安全校验
4.1 反作弊
棋牌高发作弊:
透视(看底牌/对方手牌)
多开控牌(脚本多账号同局)
外挂出牌(自动最优出牌)
防御:
服务端权威(手牌/牌序服务器持有,见上篇)
协议加密 + 防重放(见协议安全章节)
行为检测(出牌节奏/APM 异常,见反脚本章节)
同 IP/设备多账号检测(封控局)// 牌局反作弊
if (room.detectSameDevice(players)) { // 同设备多开
risk.mark(RISK_COLLUSION, roomId);
cancelAndRefund(roomId); // 拆局退款
}
if (player.actionRate() > HUMAN_APM) { // 出牌过快
risk.mark(p, "APM 异常");
}4.2 风控与合规
风控:
异常对局(新号直接高倍场)→ 验证码/限制
转账异常(金币赠送刷量)→ 限额 + 审核
合规:
未成年人防沉迷(时长/充值限制,见合规章节)
敏感词过滤(聊天/昵称,见聊天章节)
日志审计(操作留痕,见日志审计章节)五、性能压测
5.1 压测方案
压测场景(见压测章节):
登录并发:2000 同时登录
对局场景:千人对局(250 桌 × 4)
混合场景:登录 + 对局 + 商城 + 聊天
尖峰场景:开服瞬间
自研压测客户端:
模拟真实协议(Netty 连接池)
每连接按节奏出牌(模拟操作)// 压测目标指标
单服:
QPS ≥ 5000(登录+对局混合)
p95 RT ≤ 30ms(对局内)
千人同服稳定(长连接不断线)
容量:
1 万同时在线的节点数规划
压测拐点 → 容量评估(留 2 倍余量)5.2 优化与验证
压测发现与优化:
对局结算集中写 DB → 批量 + 异步落库
房间广播全量 → 增量/压缩(见协议优化)
排行榜高频写 → 延迟合并(结算后异步更新)
验证:优化前后对比(基线 → 复测)// 优化后验证
压测复测指标对比:
QPS: 5000 → 8200(+64%)
p95: 30ms → 18ms
成功: 99.9% → 99.99%六、实现要点
综合实战(下)清单:
好友邀请:邀请消息 + 有效期 + 离线补发
排行榜:ZSet 分段排行 + 缓存展示
商城:订单状态机 + 幂等发货 + 对账
安全:服务端权威 + 行为检测 + 防沉迷合规
压测:协议客户端 + 场景设计 + 优化复测
常见坑:
邀请无过期 → 过期仍可加入
排行实时查 Redis → 打爆缓存(加缓存)
发货无幂等 → 重复发商品
压测只看 p50 → 忽略长尾卡顿
与其他系统衔接:
好友/排行/商城/风控/压测 → 前 13 周对应章节
运营活动 → 活动框架章节
监控告警 → 运维章节