非幂等端点
在重复调用时具有副作用的 HTTP 方法被视为非幂等。 这意味着如果客户端调用端点并发生网络超时,重试该方法是不安全的,因为资源可能已被更新,但网络无法通知调用方它已成功。 出错时,客户端必须首先查询以查看调用是否成功,而不是重试。 只有当调用不成功时,才应重试。 在 XBOX Services API 中,某些 API 在内部被标记为调用非幂等端点。 这意味着如果在调用这些端点时发生失败,API 将不会自动重试该端点。 非幂等 API 的完整列表为:- XblMatchmakingCreateMatchTicketAsync
- XblMultiplayerWriteSessionAsync
- XblMultiplayerWriteSessionByHandleAsync
- XblMultiplayerSendInvitesAsync
- XblSocialSubmitReputationFeedbackAsync
- XblSocialSubmitBatchReputationFeedbackAsync
幂等方法
另一方面,幂等 HTTP 方法不会留下副作用。 这反过来意味着它们可以安全地重试。 在 XBOX Services API 中,所有幂等方法在某些条件下都会自动重试。 幂等 API 的完整列表是上面未列为非幂等的所有 API。重试逻辑最佳实践
对于幂等调用,应自动重试以下情况:- 所有网络错误
- 401:未授权
- 408:请求超时
- 429:请求过多
- 500:内部错误
- 502:错误网关
- 503:服务不可用
- 504:网关超时
动态调整内部 HTTP 超时
XSAPI 根据 XblContextSettingsGetHttpTimeoutWindow 中剩余的时间动态调整内部 HTTP 超时。 内部 HTTP 超时控制操作系统在中止之前执行 HTTP 网络操作的时间。 除非 XblContextSettingsGetHttpTimeoutWindow 中至少剩余 5 秒,否则不会重试调用,以便为调用完成提供足够合理的时间。 此规则不适用于第一次调用,因此将 XblContextSettingsSetHttpTimeoutWindow 设置为 0 是可以接受的,并且将导致单次调用。 此逻辑的作用是 XblContextSettingsGetHttpTimeoutWindow 对 API 调用何时返回更具确定性。 如果返回了 “Retry-After” 标头,则在达到 “Retry-After” 时间之前不会进行重试。 如果 “Retry-After” 时间在 XblContextSettingsGetHttpTimeoutWindow 之后,则调用将在 XblContextSettingsGetHttpTimeoutWindow 结束时返回。错误处理
游戏开发者应始终对每个服务调用使用正确的错误处理,他们需要确保正确处理失败的响应。 有许多现实世界的情况可能会导致对 XBOX 服务的请求返回失败代码,例如:- 网络不可用。例如,设备失去 4G、失去 Wi-Fi 或网络中断。
- 服务负载过高 (503)。
- 服务上发生故障 (500)。
- 向服务发送了太多请求 (429)。
- 写入操作冲突 (412)。例如,多人游戏会话中的另一位玩家先提交了更改。
- 用户已被禁止或没有权限。
- 用户已注销。
最佳调用模式
使用批处理请求
某些端点支持将一组请求批处理或聚合到单个调用中。 例如,使用 XBOX 服务的个人资料服务,您可以请求单个用户的个人资料或一组用户的个人资料。 因此,如果您需要一组用户的个人资料,一次针对每个用户个人资料调用端点或 API 将非常低效。 每次调用都会增加大量的身份验证开销。 因此,请一次将您想要获得信息的所有用户传递给 API,以便端点可以同时处理所有用户个人资料并返回单个响应。使用实时活动 (RTA) 服务而不是轮询
最佳实践是使用实时活动 (RTA) 服务而不是定期轮询。 实时活动服务公开了一个 Web 套接字,当目标资源在服务上发生更改时向客户端发送通知。 RTA 服务在状态更改、统计信息更改、多人游戏会话文档更改和社交关系更改时提供通知。 要了解客户端感兴趣的信息,客户端必须首先通过 Web 套接字订阅该项。 这样可以避免轮询服务以检测更改,因为您将在项发生更改时被准确告知。 XSAPI 将 RTA 服务作为一组订阅 API 公开给客户端使用。 这些 API 中的每一个都有相应的*ChangedHandler API,它接受一个回调函数,当项发生更改时将调用该函数。
- XblPresenceSubscribeToDevicePresenceChange
- XblPresenceSubscribeToTitlePresenceChange
- XblUserStatisticsSubscribeToStatisticChange
- XblSocialSubscribeToSocialRelationshipChange
使用 XSAPI 客户端管理器
XSAPI 有一组管理器,它们充当缓存和状态机,为某些场景执行所有繁重的工作。Social Manager
Social Manager 负责朋友列表和个人资料的所有繁重工作。 Social Manager 使用 RTA 服务保持您的朋友列表、他们的个人资料和他们的状态数据处于最新状态。 Social Manager 公开了一个对游戏引擎非常友好的同步 API。 游戏可以频繁调用 Social Manager API,因为 Social Manager 维护着来自服务的最新信息的内存缓存。 请参阅 Social Manager。Multiplayer Manager
对于多人游戏会话管理,Multiplayer Manager 是传统多人游戏的即插即用解决方案。 Multiplayer Manager API 包括玩家名册和会话管理,处理游戏邀请、加入进行中的游戏、匹配,并可插入到您现有的网络解决方案中。 它执行有关实现传统多人游戏流程的所有繁重工作。 请参阅 Multiplayer Manager。限流(细粒度速率限制)
XBOX 服务实施了限流以防止任何单个设备对服务造成极大的负载。 重要的是要知道您的游戏何时被限流。 要确定您的游戏是否被限流,请使用以下任何方法:- 监视 HTTP 状态代码 429
- 使用调试断言
- 使用 XBOX 服务跟踪分析器工具
