这份速查表怎么用
卷二各章分别给出了系统契约。到了接入阶段,团队真正需要的是另一张表:平台对游戏开放了哪些接口、调用时要注意什么、出错时怎么处理。
这份附录按能力列出接口清单。它不是完整的 API 文档,不包含字段级定义和示例报文;它只回答集成时最容易出错的那几件事:
- 这个接口是不是幂等的,幂等键由谁生成;
- 数据是强一致还是最终一致,窗口大概多大;
- 超时、重复、越权分别返回什么;
- 平台不可用时,游戏侧应该降级还是报错。
接口名使用能力语义命名,不绑定具体协议。RPC、HTTP 或消息都可以实现同一份契约。
一、统一约定
1.1 租户上下文
所有平台接口都必须携带租户上下文:
game_id 游戏标识,平台据此做配额、数据隔离与审计
env prod / staging / dev,禁止跨环境访问
channel 可选,渠道标识,用于账号与支付归因
request_id 调用方生成的唯一请求 ID,用于链路追踪
缺少 game_id 的请求一律拒绝。不要把租户信息放在 URL 路径里让调用方自由拼接,平台应该在网关层强制注入并校验。
1.2 幂等约定
写接口统一接受 idempotency_key。规则:
- 键由调用方生成,平台不替调用方编造;
- 同一租户、同一能力、同一键,只执行一次;
- 重复请求返回第一次的结果,不返回“已存在”错误;
- 幂等记录保留时间不短于业务重试窗口,通常 24 小时起步。
查询接口不需要幂等键,但必须接受 request_id 以便排查。
1.3 错误分类
平台错误统一归为五类,游戏侧按类别决定是否重试:
| 类别 | 典型错误码 | 是否可重试 | 调用方动作 |
|---|---|---|---|
| 参数错误 | INVALID_ARGUMENT | 否 | 修正参数 |
| 未授权 | UNAUTHENTICATED / PERMISSION_DENIED | 否 | 检查凭证与权限 |
| 冲突 | ALREADY_EXISTS / VERSION_CONFLICT | 视情况 | 读取当前状态后决定 |
| 暂时不可用 | UNAVAILABLE / DEADLINE_EXCEEDED | 是 | 退避重试,使用同一幂等键 |
| 结果未知 | UNKNOWN_RESULT | 查询后决定 | 用幂等键或查询接口确认 |
UNKNOWN_RESULT 必须单独存在。把超时当成失败,会导致调用方重复执行;把超时当成成功,会导致数据缺失。
二、账号与身份
| 接口 | 用途 | 幂等键 | 一致性 | 典型错误 |
|---|---|---|---|---|
Account.Create | 创建内部账号 | 调用方生成 | 强一致 | 重复创建、渠道标识缺失 |
Account.Get | 查询账号主体 | 不需要 | 强一致 | 不存在、已注销 |
Identity.Bind | 绑定外部身份 | provider + external_id + game_id | 强一致 | 已绑定其他账号、渠道回调重复 |
Identity.Unbind | 解绑外部身份 | 同上 | 强一致 | 最后一个登录方式不可解绑 |
Account.Merge | 合并影子账号 | 合并批次号 | 强一致 | 目标账号状态不允许 |
Account.Delete | 发起注销 | 注销申请号 | 最终一致 | 有未结算订单、冷却期内 |
关键约束:
- 一个外部身份在同一游戏内只能指向一个内部账号;
- 解绑前必须确认还有其他可用登录方式;
- 注销是异步流程,平台返回受理结果,不返回“已删完”。
三、登录与会话
| 接口 | 用途 | 幂等键 | 一致性 | 典型错误 |
|---|---|---|---|---|
Login.IssueTicket | 签发一次性登录票据 | request_id | 强一致 | 凭证错误、账号封禁 |
Login.Exchange | 票据换会话令牌 | 票据 ID | 强一致 | 票据过期、已使用 |
Session.Renew | 续期会话 | 会话 ID + 版本 | 强一致 | 会话已吊销、版本过期 |
Session.Revoke | 吊销会话 | 会话 ID | 强一致 | 会话不存在(幂等成功) |
Login.Queue | 进入登录排队 | 排队票据 | 最终一致 | 队列已满、票据过期 |
票据与会话令牌的职责不同:票据一次性、短命,用于证明“刚刚完成了身份验证”;会话令牌可续期,用于后续请求。不要用会话令牌替代登录票据,也不要把票据当成长连接凭证。
四、匹配与房间
| 接口 | 用途 | 幂等键 | 一致性 | 典型错误 |
|---|---|---|---|---|
Match.Enqueue | 进入匹配队列 | 玩家 + 模式 + 批次 | 最终一致 | 重复入队、模式不存在 |
Match.Cancel | 取消匹配 | 入队票据 | 最终一致 | 已匹配成功(返回当前状态) |
Match.Result | 查询匹配结果 | 不需要 | 最终一致 | 结果尚未生成 |
Room.Create | 创建房间 | 对局唯一键 | 强一致 | 重复创建、资源不足 |
Room.Get | 查询房间状态 | 不需要 | 强一致 | 房间不存在、已回收 |
Room.Close | 关闭房间 | 房间 ID + 版本 | 强一致 | 版本冲突、已有结算在途 |
匹配与房间是两段式契约:匹配只负责“找到人”,房间负责“落在哪”。匹配成功后房间创建失败,必须有补偿或重新入队策略,不能把玩家留在中间态。
五、结算与发奖
| 接口 | 用途 | 幂等键 | 一致性 | 典型错误 |
|---|---|---|---|---|
Settle.Submit | 提交结算单 | battle_id + season_id | 强一致 | 重复提交(返回原单)、结果非法 |
Settle.Get | 查询结算单 | 不需要 | 强一致 | 不存在、仍在处理 |
Settle.Reverse | 改判冲正 | 冲正单号 | 强一致 | 已过冲正窗口、重复冲正 |
Reward.Grant | 发放奖励 | 结算单号 + 奖励项 | 强一致 | 重复发奖(幂等成功)、资产上限 |
顺序必须是“先落结算单,再发奖”。发奖失败时结算单保持待发状态,由补偿任务重试;不要在发奖成功后再补结算单。
六、经济与交易
| 接口 | 用途 | 幂等键 | 一致性 | 典型错误 |
|---|---|---|---|---|
Wallet.Get | 查询余额 | 不需要 | 强一致 | 账号不存在 |
Wallet.Debit | 扣减 | 业务单号 | 强一致 | 余额不足、重复扣减 |
Wallet.Credit | 增加 | 业务单号 | 强一致 | 超过上限、来源非法 |
Trade.Lock | 交易托管锁定 | 交易单号 | 强一致 | 资产不足、已在交易中 |
Trade.Commit | 完成交易 | 交易单号 | 强一致 | 锁定过期、双方状态变化 |
Trade.Rollback | 回滚交易 | 交易单号 | 强一致 | 已完成(幂等成功) |
余额查询与扣减必须走同一账本。游戏服可以缓存展示余额,但任何扣减都必须由经济服务裁决。
七、社交、公会与聊天
| 接口 | 用途 | 幂等键 | 一致性 | 典型错误 |
|---|---|---|---|---|
Relation.Add | 添加好友/关注 | 双方 ID + 关系类型 | 最终一致 | 黑名单、重复添加 |
Relation.Remove | 删除关系 | 双方 ID + 关系类型 | 最终一致 | 不存在(幂等成功) |
Guild.Join | 加入公会 | 申请单号 | 强一致 | 人数已满、重复申请 |
Guild.Grant | 修改权限 | 权限版本号 | 强一致 | 版本冲突、越权 |
Chat.Send | 发送消息 | 客户端消息 ID | 最终一致 | 限速、被禁言、频道不存在 |
关系链允许最终一致,但必须保证“黑名单优先生效”;公会权限变更要立即失效,不能等缓存过期。
八、榜单、邮件与奖励
| 接口 | 用途 | 幂等键 | 一致性 | 典型错误 |
|---|---|---|---|---|
Rank.Submit | 提交分数 | 玩家 + 赛季 + 场次 | 最终一致 | 旧赛季、分数回退 |
Rank.Get | 查询榜单/名次 | 不需要 | 最终一致 | 榜单未生成 |
Mail.Send | 发送邮件 | 业务事件 ID + 收件人 | 强一致 | 重复投递(幂等成功) |
Mail.Claim | 领取附件 | 邮件 ID + 附件项 | 强一致 | 已领取、背包满 |
Mail.Expire | 过期处理 | 邮件 ID | 最终一致 | 已领取(跳过) |
榜单允许延迟可见,但必须说明延迟窗口;邮件与附件不允许丢失,也不允许重复领取。
九、支付与合规
| 接口 | 用途 | 幂等键 | 一致性 | 典型错误 |
|---|---|---|---|---|
Pay.CreateOrder | 创建订单 | 内部订单号 | 强一致 | 渠道不可用、金额非法 |
Pay.Callback | 渠道回调 | 渠道单号 | 强一致 | 验签失败、金额不符 |
Pay.Deliver | 发货 | 订单号 + 商品项 | 强一致 | 重复发货(幂等成功) |
Pay.Refund | 退款 | 退款单号 | 强一致 | 已退款、超出可退金额 |
Pay.Reconcile | 对账差异 | 对账批次 | 最终一致 | 渠道账单缺失 |
Compliance.Check | 登录/消费判定 | 请求 ID | 强一致 | 实名信息缺失、规则未配置 |
支付状态与发货状态分开;合规判定与游戏执行分开。平台给出“允许/限制/拒绝”,游戏侧负责执行与提示。
十、数据与审计
| 接口/事件 | 用途 | 幂等 | 一致性 | 备注 |
|---|---|---|---|---|
Event.Publish | 发布领域事件 | 事件 ID | 最终一致 | 至少一次投递,消费方去重 |
Audit.Write | 写审计日志 | 事件 ID | 最终一致 | 不允许修改与删除 |
Data.Export | 导出玩家数据 | 导出批次 | 最终一致 | 需审批与脱敏 |
Data.Delete | 删除个人数据 | 删除申请号 | 最终一致 | 覆盖缓存、日志、备份 |
事件总线通常保证至少一次,不保证顺序。消费方必须用事件 ID 去重,并在需要顺序时按业务键分区。
十一、平台与游戏的职责边界
| 能力 | 平台负责 | 游戏负责 |
|---|---|---|
| 账号 | 身份、绑定、注销、风控信号 | 角色创建、角色数据 |
| 登录 | 票据、会话、吊销 | 连接管理、重连、顶号 |
| 匹配 | 通用队列与分段能力 | 模式规则、队伍规则、机器人策略 |
| 房间 | 实例调度、租约、回收 | 房间内玩法与状态 |
| 结算 | 结算单、发奖、冲正 | 战斗结果判定 |
| 经济 | 账本、扣增、对账 | 产出消耗规则、活动配置 |
| 榜单 | 存储、结算、读取 | 计分规则、赛季定义 |
| 邮件 | 投递、附件、过期 | 触发时机、文案 |
| 支付 | 订单、回调、退款、对账 | 商品配置、发货内容 |
| 合规 | 规则判定 | 执行、提示、客服流程 |
边界的原则是:平台提供机制,游戏决定策略。 平台不应内置某款游戏的玩法规则,游戏也不应绕过平台直接改账号、余额或订单。
十二、常见误用
| 误用 | 后果 | 正确做法 |
|---|---|---|
| 用会话令牌代替登录票据 | 票据一次性语义丢失,重放风险 | 票据只换一次,换完即废 |
| 匹配成功后再校验资格 | 玩家进入房间才被踢 | 入队前校验,结果返回前复核 |
| 发奖成功后才写结算单 | 崩溃后无法判断是否已发 | 先落单,再发奖 |
| 游戏服直连经济库 | 绕过账本与审计 | 只走经济接口 |
| 支付回调不验签 | 伪造回调可白拿商品 | 强制验签 + 来源白名单 |
| 事件消费不去重 | 重复发奖、重复扣款 | 事件 ID 幂等表 |
| 榜单读不到就报错 | 榜单故障拖垮主流程 | 降级为“暂不可用”,不阻塞登录 |
| 删除只删主表 | 合规风险 | 删除任务覆盖缓存、日志、备份 |
十三、一页纸速查
调用任何写接口前:
1. 带 game_id / env / request_id
2. 生成幂等键,并确保重试复用同一个键
3. 明确超时后的动作:查询,而不是盲目重试
判断错误:
INVALID_ARGUMENT / UNAUTHENTICATED / PERMISSION_DENIED → 不重试
ALREADY_EXISTS / VERSION_CONFLICT → 先读状态
UNAVAILABLE / DEADLINE_EXCEEDED → 退避重试
UNKNOWN_RESULT → 用幂等键或查询接口确认
设计降级:
账号/登录不可用 → 已登录会话可短时续命,禁止新登录
匹配/榜单不可用 → 功能降级,不阻塞主流程
经济/支付不可用 → 停止相关写操作,保留待处理单
速查表到这里结束。它不能替代接口文档,但可以在评审时快速检查:每个跨系统调用,是否都回答了幂等、一致性、失败语义和降级这四个问题。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。