SWE / Infrastructure · System Design

游戏平台设计:游戏库、鉴权、促销缓存与Patch

购买资格与文件分发分离,下载速度优化不能绕过授权状态。

题目重点:购买资格与文件分发分离,下载速度优化不能绕过授权状态。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 支持用户游戏库、购买授权、促销、下载/增量patch和refund。训练抽象游戏平台,不承诺某平台实际退款期限/商业政策。
  • 拥有entitlement不等于文件本身私有加密不可复制;设计目标是控制正规服务下载/联机资格。退款后授权是否立即失效及离线使用窗口需明确。

解题路线

  1. Catalog(game,build,platform,price_version)、Entitlement(user,game,state,order_id)、BuildManifest(version,chunk_hashes,size)、Promotion(rule,window,version)分离。下单价格服务器验证quote version/期限,不相信客户端促销缓存。
  2. 游戏库是按user索引的entitlement读取,订单支付确认用幂等event ID激活。下载请求校验entitlement和platform,返回短期signed manifest/URL;CDN分发大文件,权限数据库不参与每个byte请求。
  3. 内容切片并按hash寻址,manifest给新旧版本chunk集合,client只下载缺失chunk;patch仍需校验hash/总manifest、原子切换版本。压缩或加密在切片前可能让微小修改改变大量bytes,chunk边界选择影响delta效率。
  4. 促销读高峰cache rule/version,结账重新校验并处理库存/限量原子约束。缓存stampede用请求合并及过期jitter,预热热门game;时间窗口与时区由服务端统一,不能因浏览器时钟不同改变价格。
  5. 退款请求独立状态机pending→approved/rejected→settled,通过outbox更新entitlement。撤销事件应使在线鉴权cache失效;已签URL在有效期内仍可下载,短TTL降低窗口但增加鉴权流量。客户端离线许可需要明确最大离线期,不能承诺立即全世界撤销。

手动走一遍

新build10GB,已缓存9GB相同chunk,下载缺失1GB;若manifest未校验便切版本,断电会得到混合build。用户看到促销价后活动结束,checkout可按有效quote合同兑现或提示重新确认,不能静默以更高价格成交。热门新游百万用户同时取50GB约50PB分发量,文件CDN带宽远大于订单元数据吞吐。

规模与取舍

库页按user分页O(page_size),patch比较manifest O(chunks)或分层hash树;下载成本由总缺失bytes和并发连接决定。权限服务QPS与签名TTL/连接重试相关,价格更新失效fanout需预算。

易错点与追问

容易失分的边界

  • 将客户端下载的旧促销价直接作为收费金额。
  • 退款只改订单不撤销entitlement,正规鉴权仍允许联机。
  • 覆盖安装中间文件而无可恢复版本切换,断网后无法启动。

继续深挖

  • 区域CDN容量不足时怎样分批发布、预取并控制下载公平?
  • 只更新少量资源的build,content-defined chunking与固定块有哪些取舍?
✓已复制微信号!