Amazon GameLift的工作原理 - Amazon GameLift
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon GameLift的工作原理

本主题提供了托管 Amazon GameLift 解决方案的一般概述。其中涵盖了核心组件,并描述了该服务如何向玩家提供您的多人游戏服务器。如果您想了解有关托管 GameLift 具备的功能及其工作原理的详细信息,请开始阅读本主题和以下相关主题。要了解其他解 GameLift 决方案,请参阅什么是 Amazon GameLift?

准备好在 GameLift 上开始托管您的游戏? 请参阅以下 开始使用 Amazon GameLift 主题,包括集成路线图。

关键组件

设置 Amazon GameLift 托管您的游戏需要使用以下一组关键组件。这些组件之间的关系在使用托管 GameLift 的游戏架构 中有说明。

  • 游戏服务器是指在云中运行的游戏服务器软件。您上传了您的 游戏服务器构建 (或 脚本 如果你使用 实时服务器)到 Amazon GameLift 服务并告知 GameLift 任何时候有多少游戏服务器要运行。游戏服务器进程一次可主持一个游戏会话。

  • 游戏会话 是您正在进行的游戏,起点和终点由您的游戏定义。您定义游戏会话的基本特征,例如它的生命期和玩家数。玩家连接到游戏服务器以加入游戏会话。

  • Amazon GameLift 服务管理用于托管游戏服务器的计算资源,并可以将玩家连接到游戏。它控制满足玩家需求所需的资源,启动新游戏会话,并通过在活动的游戏会话中查找和预留玩家位置来处理新玩家的请求。该服务还收集有关玩家使用情况和服务器运行状况的指标。

  • 游戏客户端是指玩家设备上运行的游戏软件。游戏客户端向 GameLift 服务发出有关可用游戏会话的请求。它还使用从 GameLift 服务接收到的信息直接连接到游戏会话。

  • 游戏服务是您可以创建的额外的自定义服务,用于处理与 GameLift 相关的特殊任务。例如,大多数游戏使用客户端服务来处理与 GameLift 服务的通信,而不是让游戏客户端直接调用服务。

有关这些组件之间交互方式的详细说明,请参阅 GameLift 和游戏客户端/服务器交互

托管游戏服务器

您上传的游戏服务器托管在称为实例的 Amazon GameLift 虚拟计算资源上。您可以创建并部署实例队组 来运行您的游戏服务器(可以使自定义服务器或者配置的 实时服务器),从而设置您的托管资源。您可以设计一个适合游戏需求的队组。

队组架构

构建适合您核心需求的队组。

  • 您的游戏需要哪种类型的资源? – GameLift 支持多种操作系统和实例类型。实例类型决定了所用计算硬件的种类,包括处理能力、内存和网络容量。请注意,队组成本基于所用实例的类型和数量。根据游戏的要求,您可以选择使用多个小实例或者较少但处理能力更强的实例。了解有关如何选择计算资源的更多信息。

  • 您想在哪里运行游戏服务器? – 不管你有玩家在等你加入游戏,你都设置了机队。每个队组部署到一个 AWS 区域,但您可根据需要在任意数量的区域中创建队组。请参阅 AWS 区域和终端节点中 Amazon GameLift 支持的区域。

  • 游戏服务器的可靠性有多重要? – 您的车队使用即时实例或按需实例。Spot 实例(基于 EC2 的 Spot 实例)通常成本更低,但是可能会在游戏会话期间中断。不过,GameLift 有额外的保护机制,确保游戏中断的情况极少发生,对于大多数游戏而言,使用 Spot 实例的队组是理想之选。按需实例则相反,提供稳定的可用性,但价格更高。对于游戏中断会对玩家造成很大影响的游戏,这是理想之选。了解有关按需实例与 Spot 实例的更多信息。

  • 您需要支持多少球员? – 机队可以有多个实例,每个实例都能够同时主持多个游戏会话。您可以根据需要在队组中添加或删除实例,并可以使用 auto-scaling,在玩家需求变动时自动进行调整。了解有关扩展 队组容量的更多信息。

服务器运行时配置

一个队组实例可以同时运行多个进程,并可以运行您的游戏服务器生成包中的任意可执行文件。为确定进程应如何在各个实例上运行,您需要创建运行时配置。该配置指定:(1) 要运行的可执行文件,(2) 每个可执行文件同时运行多少个进程,以及 (3) 启动各个可执行文件时使用的所有启动参数。实例可以同时运行的进程数取决于实例的计算能力(实例类型)以及游戏服务器生成包的需求。了解有关在一个队组上运行多个进程的更多信息。运行时配置可以在队组的整个生命周期内更新。

运行时配置还会影响新游戏会话如何在实例上启动。一些游戏在启动阶段需要大量资源,限制在任意时间可用于激活新游戏会话的资源就是一个很好的做法。您可以指定每个实例同时进行的游戏会话激活最大数。您还可以对各个游戏会话激活施加时间限制,以快速检测和关闭未能激活的任意游戏会话。

队组别名

别名 是可以从一个实际队组传输到另一个队组的称号,从而方便地泛化队组位置。例如,游戏客户端需要指定在哪里(哪个队组)放置新游戏会话。使用别名,您可将游戏客户端从一个队组切换到另一个队组,而无需更改游戏客户端。您可以使用多种 GameLift 功能中的选项来指定队组或别名。您还可以创建一个“终端”别名,这使您可以指向内容(例如某个 URL)而不是连接到服务器。此功能很有用,例如,提示玩家升级其客户端。

运行游戏会话

一旦游戏服务器生成包成功部署到某个队组,该队组便已准备好托管游戏会话。要为一个或多个玩家启动新的游戏会话,您的游戏客户端(通过游戏服务)向 GameLift 服务发送请求。收到您的请求后,GameLift 使用一种称为 FleetIQ 的功能,将新游戏会话放入“最佳”队组。

“最佳队组”的含义由您在定义游戏会话队列时,根据游戏优先级定义。队列创建包含一个或多个队组的群组,并定义如何在群组中为游戏会话选择最佳队组。队列可包含位于不同区域的队组。新的游戏会话请求指定要使用的队列,并且 GameLift 可以将新游戏会话与队列中的任何可用队组放在一起。例如,您可能将队列与北美五个地区中每个地区的队组一起使用。利用这种多区域队列,GameLift 更有可能找到可用的资源(即使在流量高峰时段)并快速启动新游戏会话。队组可用仅仅表示队组中的某个位置至少有一个实例具有游戏服务器进程,可用于托管新游戏会话。

选择新游戏会话的最佳放置位置时,FleetIQ 使用以下两种方法之一:

  • 评估玩家延迟 – 对新游戏会话的请求可以包括请求中每个玩家的 ping 时间。如果提供了此数据,FleetIQ 进行评估,以确定哪些区域将为玩家提供最低的延迟。GameLift 使用此信息来放置新的游戏会话。您还可以定义延迟策略,用于确保不会将玩家置入具有不可接受延迟的游戏会话。

  • 使用区分优先级的队组列表 – 对于不包含玩家延迟数据的请求,FleetIQ 根据队组在队列中的列出顺序放置新游戏会话。您可以通过将队组放在队组顺序列表的顶部来调整队组在队列中的优先级。此方法通常会导致所有游戏会话都放在列出的第一个队列中,而剩余的队列用作第一个队组已满时的备份。

队列是一个很有用的概念,可用于解决一系列容量和可用性问题。队列可以用于跨区域平衡资源,为玩家减少意外需求高峰时段的等待时间,以及防范区域速度下降或宕机。您还可以使用它们来创建跨区域的玩家池,这样不同区域中的玩家可以在一起玩游戏。在使用 FlexMatch 对战或 GameLift Spot 队组时必需使用队列。了解有关如何设计游戏会话队列的更多信息。

在队组实例上启动游戏会话之后,GameLift 服务以 IP 地址或 DNS 名称和端口的形式,将连接信息提供给游戏客户端。您的游戏客户端使用此信息来连接到游戏服务器。根据您设置游戏服务器的方式,在连接时,它可以与 GameLift 服务通信,以验证玩家并报告玩家的连接状态。

扩展 队组容量

当某个队组激活并准备好托管游戏会话后,您可以调整队组容量以满足玩家需求。托管的成本取决于您使用的容量,因此,您需要在确保所有传入的玩家都能找到游戏与过度使用闲置资源之间找到平衡。

您可以通过调整队组中的实例数量来扩展队组。运行时配置确定每个实例可以承载多少游戏会话和玩家,因此通过扩展实例,您可以增加或减少游戏会话和玩家的可用性。GameLift 提供了高效的自动扩展工具,您也可以选择手动设置队组容量。了解有关如何扩展 GameLift 队组容量的更多信息。

自动扩展

通过启用自动扩展,GameLift 会跟踪队组的托管指标,并根据您定义的一组准则确定何时添加或删除实例。有了正确的自动扩展策略,GameLift 可以根据玩家需求的变化直接调整容量。了解有关利用自动扩展提高成本效益的更多信息。

自动扩展有两种方法:

  • 基于目标的扩展 – 使用此方法,您指定所需的结果,而 GameLift 扩展或缩减队组以实现相应结果。目标跟踪使用指标“可用游戏会话百分比”,也即,当前未托管游戏会话的正常运行的服务器进程的百分比。可用的游戏会话是您的缓冲区,它们代表可以在最短等待时间内加入游戏的新游戏会话和新玩家的数量。使用目标跟踪,您选择适合您的游戏的缓冲区大小。例如,对于需求高度波动的游戏,您可能需要更大的缓冲区大小。此方法是首选方法,因为它对更多游戏更简单、更有效。了解有关“目标跟踪”如何工作的更多信息。

  • 基于规则的扩展 – 此方法使您可以更精细地控制扩展操作。它的设置和管理也更加复杂,并且更可能产生意想不到的结果。每个策略都指定何时触发扩展事件以及响应时应采取的措施。例如,策略可能声明: 如果空闲实例连续10分钟低于20,则容量增加10%。大多数队组需要多个策略来有效地管理队组容量,但是多个策略可能会产生意想不到的组合影响,从而增加了复杂性。了解如何使用基于规则的策略自动扩展

执行队组扩展操作

可以通过多种方式触发队组扩展事件:通过自动扩展或手动扩展对所需容量进行更改,或者出于运行状况或其他原因而关闭实例。实质上,所有扩展事件都是在队组“所需的”实例计数与其“活动的”实例计数不相符时触发。此情况会导致 Amazon GameLift 根据需要添加或删除实例,以使活动的实例计数与所需的实例计数相符。

  • 当所需的实例计数超过活动的实例计数时,Amazon GameLift 将请求其他实例,一旦有其他实例可用,就会开始安装游戏服务器生成包和启动游戏服务器进程的过程。一旦有一个服务器进程在实例上激活,活动的实例数就会加一。Amazon GameLift 继续添加实例,直到两个计数值相等。

  • 当活动的实例数超出所需的实例计数时,Amazon GameLift 开始搜索它可以删除的实例。任何可用的实例 (即未托管任何游戏会话) 以及任何不受保护的实例 (即使托管着活动的游戏会话) 都可以终止。如果没有实例可以删除,则缩减事件失败。在这种情况下,所需的实例计数与活动的实例计数之间的不一致将继续触发缩减事件,直到有实例可以删除。然后,Amazon GameLift 启动终止流程,其中包括通知此实例上的所有服务器进程启动正常关闭。一旦终止了实例,活动实例的数量就会减一。Amazon GameLift 继续删除实例,直到两个计数值相等。

其他扩展功能

队组容量和扩展相关的其他功能包括:

  • 游戏会话保护 – 防止托管活动的玩家的游戏会话在缩减事件期间被终止。游戏会话保护可以在队组范围开启,也可以针对单独的游戏会话开启。如果实例的任何服务器进程正在托管受保护的游戏会话,则无法终止此实例。游戏会话由于运行状况或 Spot 实例相关的中断而不受保护,导致被终止 (请参阅按需实例与 Spot 实例)。

  • 扩展限制 – 通过对队组中的实例数设置最小和最大限制,控制总体实例使用情况。这些限制在自动扩展或手动设置容量时适用。

  • 启用/禁用自动扩展 – 在队组级别启用或禁用自动扩展,而不更改或删除自动扩展策略。此功能可让您在需要时手动暂时扩展您的队组。

  • 扩展指标 – 以图形方式跟踪队组的容量和扩展事件的历史记录。查看容量以及队组利用率指标,以评估扩展方法的有效性。下图显示一个目标跟踪设置为 15% 缓冲区的队组;可用游戏会话槽的百分比 (绿色) 会随队组容量 (蓝色和橙色) 更改而自动调整。

监控队组活动和故障排除

在队组设置完毕并开始运行后,Amazon GameLift 会收集各种信息,以帮助您监控已部署的游戏服务器的性能。此信息可用于优化资源使用、排除问题以及深入了解玩家在游戏中的活动情况。

  • 队组、游戏会话和玩家会话详细信息 – 此数据包括可帮助识别运行状况问题的状态,以及游戏会话时长和玩家连接时间等详细信息。

  • 使用率指标 – Amazon GameLift 在一段时间内跟踪队组指标:

    • 对于实例:网络活动和 CPU 使用率

    • 对于服务器进程:活动进程数、新激活和终止

    • 对于游戏和玩家:活动游戏会话和玩家会话的数量

  • 服务器进程运行状况 – Amazon GameLift 跟踪队组中运行的每个服务器进程的运行状况,包括正常运行的进程数、正常运行的活动进程的百分比以及异常终止的数量。

  • 游戏会话日志 –您可以让游戏服务器记录会话数据,并将 Amazon GameLift 设置为在游戏会话结束时收集和保存日志。日志随后可从服务中下载。

所有数据均可通过 Amazon GameLift 控制台访问。控制台控制面板显示所有生成包和队组中的活动的概览,以及查看更多详细信息的选项。

AWS 资源的联网

很多时候,您希望您的托管游戏服务器和应用程序能够与您的其他 AWS 资源通信。例如,您可能使用一组 Web 服务来支持您的游戏,例如玩家身份验证或社交网络。由于所有权问题,这种通信面临一个挑战。当您使用 Amazon GameLift 部署游戏服务器时,队组和实例分配给您的账户,但它们却为 Amazon GameLift 服务所有并受其管理。于是,要访问您的 AWS 账户管理的 AWS 资源,您需要明确授予针对 Amazon GameLift 服务的访问权限。

Amazon GameLift 提供了几个用于管理此类访问的选项。了解有关如何与来自车队的其他AWS资源通信的更多信息。