这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《游戏服务端编程实践》11.1 架构拆分与职责边界
从业务域、玩法、读写和团队四个维度讨论服务拆分,给出变更频率、伸缩差异、故障隔离、数据所有权与认知负担五条判据,识别共享数据库、共享缓存 key 与跨服务 JOIN 三种反模式,并用 Go 依赖图实现环检测、资源所有权校验与越权拒绝,附可运行测试。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
从业务域、玩法、读写和团队四个维度讨论服务拆分,给出变更频率、伸缩差异、故障隔离、数据所有权与认知负担五条判据,识别共享数据库、共享缓存 key 与跨服务 JOIN 三种反模式,并用 Go 依赖图实现环检测、资源所有权校验与越权拒绝,附可运行测试。
讨论聊天服按频道分片时的分片键选择、一致性哈希的稳定性、实例摘除与迁移顺序、跨分片私聊和热点频道隔离,并给出可测试的 ShardRouter 实现,避免同一频道被多个实例重复处理;文章用路由器代码说明频道归属的不变量,并给出迁移与热点回退的检查清单。
沿着客户端到网关再到聊天服的完整链路,拆解群聊成员表来源、在线推送与离线转存、发言长度与频率限制、重复消息抑制,并给出可测试的 GroupChat 实现,说明广播必须只落在真正的成员身上;文中用假连接验证投递边界、离线补发顺序与限频窗口的边界。
从 Redis Pub/Sub 的至多一次语义出发,梳理聊天频道命名、发布与订阅连接分离、断线重连后的补订阅,并给出可测试的内存 Broker 实现与频道校验规则,帮助读者判断哪些消息能走 Pub/Sub、哪些必须换用持久化队列;文中测试覆盖多订阅者、退订与重连补订阅。
从赠送体力、点赞和组队邀请的共同骨架出发,讨论关系校验、频率限制、收益上限与幂等键,再比较全服、好友、公会排行榜的数据来源和读写成本,说明密集并列名次、稳定排序与赛季重置,并给出维护 TopN 的 RankBoard 实现和测试,同时指出读放大、缓存与赛季版本失效的边界。
拆解公会与联盟的两层组织结构、成员角色与权限矩阵,讨论加入退出、踢人解散、会长主动转让与离线继承的判定,说明资产账本和跨服赛季数据的归属,并给出带容量、终态和继任规则的 Guild 状态机实现,以及权限、继任和解散清理的测试场景;所有权限必须由服务端统一校验,不能依赖前端隐藏按钮。
从单向申请与双向好友的模型差异出发,拆解同意、删除、数量上限和黑名单优先级,说明跨服好友如何用归一化 pair key 保证成对写入、把持久关系与在线状态分离,并给出可测试的 FriendStore 实现,以及重复申请、残留申请、拉黑后私聊与组队拦截的测试。
聊天过滤不能只靠客户端,也不能把所有规则塞进一个大正则。本篇拆解长度与频率、敏感词、链接和广告的过滤层次,比较 AC 自动机与正则,讨论先发后审、误杀申诉和词表热更,并给出可测试的 Go 匹配实现,测试覆盖命中、重叠、大小写与全半角等四类变体。
聊天消息从接入到投递要经过校验、过滤、路由和队列。本篇比较同步转发与异步队列,讨论消息 ID、频道内顺序、去重与跨网关投递,并给出按频道分片串行、跨频道并行的 Go 队列实现,测试覆盖顺序、满队列、并行和关闭四种边界,以及队列隔离与背压策略。
私聊、房间、世界和系统公告的投递语义并不相同。本篇拆解频道成员、权限、禁言、离线消息与多端同步,给出带成员校验和发言权限的 Go 实现与测试边界,并总结世界频道广播风暴、私聊绕过黑名单、离线消息无限堆积等常见错误,以及可运行的频道模型测试。
商城和玩家交易是货币离开与重新分配的主要通道。本篇讨论商品、限购、上下架与渠道差异,订单为什么必须按业务单号幂等;玩家交易用托管状态机保证双方原子性,并给出交易锁、二次确认和异常价格检测。Go 实现包含幂等 Buy 与托管 Trade,测试覆盖重复下单、余额不足和撤销退款。
经济系统是否健康,不能只看充值流水。本篇区分产出、消耗、存量与通胀四个指标,按日和周聚合流水,讨论工作室与脚本如何扭曲数据,并给出可审计的调控手段。Go 实现用 Ledger 记录带分类和时间的产出消耗,支持时间窗口汇总与重复导入幂等,最后总结常见错误。
游戏经济系统的第一块地基是货币模型:免费、付费、绑定、活动代币各自能做什么,兑换方向与手续费如何限制,金额为什么必须用整数最小单位。本篇给出兑换边界、滑点与溢出的处理方式,并用 Go 实现带方向的 Wallet 与可运行测试,同时讨论跨币种结算和兑换上限这类常见漏洞。
日常任务的核心不是每天把计数清零,而是用稳定的周期键判断是否跨期。本篇讨论自然日与 ISO 周的时区边界、跨天在线与幂等重置、一次性与累计成就、进度与奖励分离,并给出防刷与离线补算策略,最后用跨天、重复重置、跨天在线和时区边界测试验证实现。
任务进度不应该由战斗、背包、场景代码各自直接修改。本篇把击杀、采集、到达统一成事件,讨论事件结构、订阅顺序、同步与异步边界、幂等键与事件风暴,并给出带去重和 panic 隔离的事件总线实现,最后总结重入与条件校验的常见错误、边界与实现中的取舍。
任务不是完成与未完成的布尔值,而是未接、进行中、可交付、已完成、失败五个状态。本篇拆解前置任务、互斥关系与四类进度模型,给出交付时状态变更与奖励发放的原子实现,并用前置未满足、重复交付、放弃重置三组测试覆盖边界,最后总结任务系统最常见的数据不一致问题。
对比开格子、开背包页与仓库三种扩展方式,分析整包序列化和逐物品行在并发、审计与查询上的取舍,说明快照版本、容量字段与加载修复规则,并用 Go 实现 Snapshot/Restore 往返、损坏数据修复、版本迁移与扩容测试,最后给出上线顺序与备份建议。
说明装备槽位、穿戴条件与绑定规则,对比属性增量修改与整组重算在幂等性和性能上的差异,拆解强化成功率、失败惩罚和保底设计,并用 Go 实现注入随机源的 EquipSet 与纯状态迁移 Enhance,覆盖成功率边界、失败不吞材料、保底跳过随机与事务边界测试。
从物品定义与实例分离讲起,说明最大堆叠、不可堆叠、绑定隔离三条规则,对比槽位背包与无序背包在索引稳定性和空槽管理上的取舍,并用 Go 实现事务化 Add、稳定槽位、拆分合并与跨堆填充测试,最后给出背包协议与失败场景的边界建议,帮助读者建立可测试的物品模型。
帧同步战斗断线后,玩家需要带着战斗 ID、最后确认帧和会话凭证回到同一场战斗。本篇比较快照恢复与全量重放,讨论断线期间的冻结、托管和踢出,并给出幂等的 Resume 实现,以及快照过期、帧号超前和重复重连的测试,最后总结恢复流程的常见错误与边界。