

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

# 自定义游戏托管解决方案
<a name="customize-solution-intro"></a>

在搭建好基本的游戏托管解决方案后，您可以通过以下主题对其进行自定义与增强配置，以优化玩家体验、提升成本效益，并添加高级功能。本节按主要影响的组件，分类介绍各种自定义选项。请根据您的游戏需求与玩家群体特征，选择最适配的自定义设置。

**主题**
+ [游戏服务器生成包自定义](customize-game-server-builds.md)
  + [将您的Amazon GameLift Servers托管游戏服务器连接到其他 AWS 资源](gamelift-sdk-server-resources.md)
  + [让您的游戏服务器访问 Amazon GameLift Servers 实例集数据](gamelift-sdk-server-fleetinfo.md)
  + [为 Amazon GameLift Servers 设置 VPC 对等连接](vpc-peering.md)
+ [玩家会话和对战自定义](customize-player-sessions-matchmaking.md)
  + [生成玩家 ID](player-sessions-player-identifiers.md)
  + [为 Amazon GameLift Servers 添加 FlexMatch 对战](gamelift-match-intro.md)
+ [游戏会话放置自定义](customize-game-session-placement.md)
  + [自定义游戏会话队列](queues-design.md)
  + [优先考虑游戏会话放置](queues-design-priority.md)
  + [为竞价型实例构建队列](spot-tasks.md)
+ [托管资源自定义](fleets-design.md)
  + [为托管式实例集选择计算资源](gamelift-compute.md)
  + [自定义 Amazon GameLift Servers 容器实例集](containers-design-fleet.md)
  + [借助竞价型实例集降低游戏托管成本](fleets-spot.md)
  + [在托管式 Amazon GameLift Servers 上优化游戏服务器运行时配置](fleets-multiprocess.md)
  + [使用 Amazon GameLift Servers 代理](integration-dev-iteration-agent.md)
  + [使用别名抽象化 Amazon GameLift Servers 实例集名称](aliases-intro.md)

# 游戏服务器生成包自定义
<a name="customize-game-server-builds"></a>

游戏服务器版本自定义提供了增强游戏服务器功能的机会，包括利用其他 AWS 服务。这些自定义设置可将游戏服务器功能从基础托管层面进一步向外拓展，以支持高级功能和集成。

# 将您的Amazon GameLift Servers托管游戏服务器连接到其他 AWS 资源
<a name="gamelift-sdk-server-resources"></a>

当您创建要在 Amazon GameLift Servers 实例集上部署的游戏服务器生成包时，您可能希望游戏生成包中的应用程序能够与您拥有的其他 AWS 资源直接安全地通信。由于 Amazon GameLift Servers 管理您的游戏托管实例集，因此您必须向 Amazon GameLift Servers 提供对这些资源和服务的有限访问权限。

一些示例场景包括：
+ 使用 Amazon CloudWatch 代理从托管 EC2 队列和 Anywhere 队列收集指标、日志和跟踪。
+ 将实例日志数据发送到 Amazon CloudWatch 日志。
+ 将消息存储在 Amazon Simple Storage Service (Amazon S3) 存储桶中。
+ 读写在 Amazon DynamoDB 数据库或其他数据存储服务中存储的游戏数据，例如游戏模式或清单。
+ 使用 Amazon Simple Queue Service（Amazon SQS）将信号直接发送到实例。
+ 访问在 Amazon Elastic Compute Cloud (Amazon EC2) 上部署和运行的自定义资源。

Amazon GameLift Servers 支持以下方法来建立访问权限：
+ [使用 IAM 角色访问 AWS 资源](#gamelift-sdk-server-resources-roles)
+ [通过 VPC 对等互连访问 AWS 资源](#gamelift-sdk-server-resources-vpc)

## 使用 IAM 角色访问 AWS 资源
<a name="gamelift-sdk-server-resources-roles"></a>

使用 IAM 角色指定谁可以访问您的资源并设置访问限制。受信任方可以“担任”角色并获得临时安全证书，以授权他们与资源进行交互。当各方发出与资源相关的 API 请求时，他们必须提供证书。

要设置由 IAM 角色控制的访问权限，请执行以下任务：

1. [创建 IAM 角色。](#gamelift-sdk-server-resources-roles-create)

1. [修改应用程序以获取凭证](#gamelift-sdk-server-resources-roles-apps)

1. [将实例集与 IAM 角色关联](#gamelift-sdk-server-resources-roles-fleet)

### 创建 IAM 角色。
<a name="gamelift-sdk-server-resources-roles-create"></a>

在此步骤中，您将创建一个 IAM 角色，该角色具有一组用于控制 AWS 资源访问权限的权限和一个授予使用该角色权限的权限的信任策略。Amazon GameLift Servers

有关如何设置 IAM 角色的说明，请参阅[为 Amazon GameLift Servers 设置 IAM 服务角色](setting-up-role.md)。在创建权限策略时，请选择您的应用程序需要使用的特定服务、资源和操作。作为最佳实操，请尽可能限制权限的范围。

创建角色后，记下其 Amazon 资源名称（ARN）。在创建实例集期间，您需要角色 ARN。

### 修改应用程序以获取凭证
<a name="gamelift-sdk-server-resources-roles-apps"></a>

在此步骤中，您将应用程序配置为获取 IAM 角色的安全证书，并在与您的 AWS 资源交互时使用这些证书。参见下表，根据（1）应用程序的类型以及（2）您的游戏用于与 Amazon GameLift Servers 通信的服务器 SDK 版本来确定如何修改您的应用程序。


|  | 游戏服务器应用程序 | 其他客户端应用程序 | 
| --- | --- | --- | 
|  **使用服务器软件开发工具包版本 5.x**  |  从您的游戏服务器代码中调用服务器软件开发工具包方法 `GetFleetRoleCredentials()`。  |  向应用程序添加代码，以便从队列实例上的共享文件中提取证书。  | 
|  **使用服务器软件开发工具包版本 4 或更早版本**  |   `[AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)`使用角色 ARN 调用 AWS Security Token Service (AWS STS)。  |  `[AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)`使用角色 ARN 调用 AWS Security Token Service (AWS STS)。  | 

**注意**  
对于集装箱舰队，`FleetRoleArn`证书将注入每个容器。您的应用程序可以使用默认 AWS 凭证提供程序来访问这些证书。您仍然可以调用`GetFleetRoleCredentials()`，这会返回相同的凭据。这些舰队角色证书只能在容器内访问。

对于与服务器软件开发工具包 5.x 集成的游戏，此图说明了您部署的游戏版本中的应用程序如何获取 IAM 角色的证书。

![\[游戏可执行文件调用 GetFleetRoleCredentials()。其他文件使用本地存储的共享凭证。\]](http://docs.aws.amazon.com/zh_cn/gameliftservers/latest/developerguide/images/instance-role-creds_vsd.png)


#### 调用 `GetFleetRoleCredentials()`（服务器软件开发工具包 5.x）
<a name="gamelift-sdk-server-resources-roles-apps-sdk5"></a>

在您的游戏服务器代码（该代码应该已经与 Amazon GameLift Servers 服务器 SDK 5.x 集成）中，调用 `GetFleetRoleCredentials`（[C\$1\$1](integration-server-sdk5-cpp-actions.md#integration-server-sdk5-cpp-getfleetrolecredentials)）（[C\$1](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-getfleetrolecredentials)）（[Unreal](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-getfleetrolecredentials)）（[Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-getfleetrolecredentials)）以检索一组临时凭证。证书过期后，您可以通过再次调用 `GetFleetRoleCredentials` 来刷新凭证。

#### 使用共享凭据（服务器软件开发工具包 5.x）
<a name="gamelift-sdk-server-resources-roles-apps-sdk5-shared"></a>

对于使用服务器 SDK 5.x 与游戏服务器生成包一起部署的非服务器应用程序，请添加代码以获取和使用存储在共享文件中的凭证。Amazon GameLift Servers 会为每个实例集实例生成一个凭证配置文件。这些凭证可供实例上的所有应用程序使用。Amazon GameLift Servers 会不断刷新临时凭证。

您必须将队列配置为在创建队列时生成共享凭证文件。

在每个需要使用共享凭据文件的应用程序中，指定文件位置和配置文件名称，如下所示：

Windows：

```
[credentials]
shared_credential_profile= "FleetRoleCredentials"
shared_credential_file= "C:\\Credentials\\credentials"
```

Linux：

```
[credentials]
shared_credential_profile= "FleetRoleCredentials"
shared_credential_file= "/local/credentials/credentials"
```

**示例：设置 CloudWatch 代理以收集Amazon GameLift Servers队列实例的指标**

如果您想使用 Amazon CloudWatch 代理从您的Amazon GameLift Servers车队收集指标、日志和跟踪，请使用此方法授权代理将数据发送到您的账户。在此场景中，请采取以下步骤：

1. 检索或写入 CloudWatch 代理`config.json`文件。

1. 如上所述，更新 `common-config.toml` 代理文件以识别凭证文件名和配置文件名称。

1. 设置游戏服务器版本安装脚本以安装和启动 CloudWatch 代理。

#### 使用 `AssumeRole()`（服务器软件开发工具包 4）
<a name="gamelift-sdk-server-resources-roles-apps-sdk4"></a>

向您的应用程序添加代码以担任 IAM 角色并获取与您的 AWS 资源交互的证书。任何在带有服务器 SDK 4 或更早版本的 Amazon GameLift Servers 实例集实例上运行的应用程序都可以代入 IAM 角色。

在应用程序代码中，在访问 AWS 资源之前，应用程序必须调用 AWS Security Token Service (AWS STS) `[AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)` API 操作并指定角色 ARN。此操作会返回一组临时证书，用于授权应用程序访问 AWS 资源。有关更多信息，请参阅 *IAM 用户指南*中的将[临时证书与 AWS 资源配合使用](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)。

### 将实例集与 IAM 角色关联
<a name="gamelift-sdk-server-resources-roles-fleet"></a>

在创建 IAM 角色并更新游戏服务器版本中的应用程序以获取和使用访问凭证后，您可以部署队列。配置新队列时，请设置以下参数。

对于集装箱船队：
+  [FleetRoleArn](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_CreateContainerFleet.html#gameliftservers-CreateContainerFleet-request-FleetRoleArn)— 将此参数设置为 IAM 角色的 ARN。

对于其他舰队类型：
+  [ InstanceRoleArn](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_FleetAttributes.html#gamelift-Type-FleetAttributes-InstanceRoleArn)— 将此参数设置为 IAM 角色的 ARN。
+  [ InstanceRoleCredentialsProvider](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_FleetAttributes.html#gamelift-Type-FleetAttributes-InstanceRoleCredentialsProvider)— Amazon GameLift Servers 要提示为每个队列实例生成共享凭证文件，请将此参数设置为`SHARED_CREDENTIAL_FILE`。

创建队列时必须设置这些值。以后，无法对其进行更新。

## 通过 VPC 对等互连访问 AWS 资源
<a name="gamelift-sdk-server-resources-vpc"></a>

您可以使用 Amazon Virtual Private Cloud (Amazon VPC) 对等互连在Amazon GameLift Servers实例上运行的应用程序与其他 AWS 资源之间进行通信。VPC 是您定义的虚拟专用网络，其中包括通过您管理的一组资源 AWS 账户。每个 Amazon GameLift Servers 队组都有它自己的 VPC。通过 VPC 对等互连，您可以在队列和其他 AWS 资源的 VPC 之间建立直接的网络连接。

Amazon GameLift Servers 简化了为游戏服务器设置 VPC 对等连接的过程。它会处理对等请求、更新路由表，并根据需要配置连接。有关如何为游戏服务器设置 VPC 对等连接的更多信息，请参阅[为 Amazon GameLift Servers 设置 VPC 对等连接](vpc-peering.md)。

**注意**  
容器队列不支持 VPC 对等互连。

# 让您的游戏服务器访问 Amazon GameLift Servers 实例集数据
<a name="gamelift-sdk-server-fleetinfo"></a>

在某些情况下，您的自定义游戏生成包或 Amazon GameLift Servers Realtime 脚本可能需要有关 Amazon GameLift Servers 实例集的信息。例如，您的游戏版本或脚本可能包含以下代码：
+ 根据实例集数据监控活动。
+ 汇总指标以按实例集数据跟踪活动。（许多游戏都使用这些数据进行 LiveOps 活动。）
+ 为自定义游戏服务提供相关数据，例如用于对战、额外容量扩展或测试。

队列信息以 JSON 文件形式显示在每个实例上，位于以下位置：
+ Windows：`C:\GameMetadata\gamelift-metadata.json`
+ Linux：`/local/gamemetadata/gamelift-metadata.json`

该`gamelift-metadata.json`文件包含[Amazon GameLift Servers舰队资源的属性](https://docs.aws.amazon.com/gamelift/latest/apireference/API_FleetAttributes.html)。

示例 JSON 筛选条件

```
{
    "buildArn":"arn:aws:gamelift:us-west-2:123456789012:build/build-1111aaaa-22bb-33cc-44dd-5555eeee66ff",
    "buildId":"build-1111aaaa-22bb-33cc-44dd-5555eeee66ff",
    "fleetArn":"arn:aws:gamelift:us-west-2:123456789012:fleet/fleet-2222bbbb-33cc-44dd-55ee-6666ffff77aa",
    "fleetDescription":"Test fleet for Really Fun Game v0.8",
    "fleetId":"fleet-2222bbbb-33cc-44dd-55ee-6666ffff77aa",
    "name":"ReallyFunGameTestFleet08",
    "fleetType":"ON_DEMAND",
    "instanceRoleArn":"arn:aws:iam::123456789012:role/S3AccessForGameLift",
    "instanceType":"c5.large",
    "serverLaunchPath":"/local/game/reallyfungame.exe"
}
```

# 为 Amazon GameLift Servers 设置 VPC 对等连接
<a name="vpc-peering"></a>

本主题提供有关如何在 Amazon GameLift Servers 托管游戏服务器与其他非 Amazon GameLift Servers 资源之间建立 VPC 对等连接的指导。使用亚马逊虚拟私有云 (VPC) Virtual Private Cloud 对等连接使您的游戏服务器能够与您的 AWS 其他资源（例如 Web 服务或存储库）进行直接私密通信。您可以与任何在您有权访问的 AWS 账户上运行 AWS 并由其管理的资源建立 VPC 对等关系。

**注意**  
VPC 对等连接是一项高级特征。要了解使您的游戏服务器能够与其他 AWS 资源进行直接和私密通信的首选选项，请参阅[将您的Amazon GameLift Servers托管游戏服务器连接到其他 AWS 资源](gamelift-sdk-server-resources.md)。

如果您已经熟悉 Amazon VPCs 和 VPC 对等互连，请理解，设置与Amazon GameLift Servers游戏服务器的对等互连有些不同。您无权访问包含游戏服务器的 VPC（该 VPC 由 Amazon GameLift Servers 服务控制），因此无法直接为其请求 VPC 对等连接。而应首先对非 Amazon GameLift Servers 资源预授权 VPC，以接受来自 Amazon GameLift Servers 服务的对等连接请求。然后，触发 Amazon GameLift Servers 以请求刚刚授权的 VPC 对等连接。Amazon GameLift Servers 处理创建对等连接、设置路由表和配置连接的任务。

## 为现有实例集设置 VPC 对等连接
<a name="vpc-peering-existing"></a>

1. 

**获取 AWS 账户 ID 和凭证。**

   您需要以下 AWS 账户的 ID 和登录凭证。您可以 IDs 通过登录[AWS 管理控制台](https://console.aws.amazon.com/)并查看您的账户设置来找到 AWS 账户。要获取凭证，请转到 IAM 控制台。
   + AWS 用于管理Amazon GameLift Servers游戏服务器的帐户。
   + AWS 用于管理非Amazon GameLift Servers资源的帐户。

   如果您对 Amazon GameLift Servers 和非 Amazon GameLift Servers 资源使用同一账户，则仅需该账户的 ID 和凭证。

1. 

**为每个 VPC 获取标识符。**

   获取以下信息，以便两者 VPCs 相互对等：
   + Amazon GameLift Servers 游戏服务器的 VPC：这是您的 Amazon GameLift Servers 实例集 ID。您的游戏服务器部署在 EC2 实例的队组上的 Amazon GameLift Servers 中。队组都自动放置在自己的 VPC 中，后者由 Amazon GameLift Servers 服务进行管理。您没有 VPC 的直接访问权限，因此使用实例集 ID 标识。
   + 您的非Amazon GameLift Servers AWS 资源的 VPC — 您可以与您有权访问的 AWS 账户上运行 AWS 并由其管理的任何资源建立 VPC 对等关系。如果您还没有为这些资源创建 VPC，请参阅 [Amazon VPC 入门](https://docs.aws.amazon.com/vpc/latest/userguide/getting-started-ipv4.html)。创建 VPC 后，您可以通过登录[AWS 管理控制台](https://console.aws.amazon.com/)适用于 Amazon 的 VPC 并查看您的 VPC 来找到 VPC ID VPCs。
**注意**  
设置对等互连时，两者 VPCs 必须位于同一区域。您的 Amazon GameLift Servers 队组游戏服务器的 VPC 与队组在相同区域中。

1. 

**授权 VPC 对等连接。**

   在此步骤中，您预授权将来从 Amazon GameLift Servers 将用于游戏服务器的 VPN 与用于非 Amazon GameLift Servers 资源的 VPC 建立对等连接的请求。此操作将更新您的 VPC 的安全组。

   要授权 VPC 对等互连，请调用服务 API [ CreateVpcPeeringAuthorization()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_CreateVpcPeeringAuthorization.html) 或使用 AWS CLI 命令`create-vpc-peering-authorization`。使用管理您的非 Amazon GameLift Servers 资源的账户发出此调用。确定以下信息：
   + 对等 VPC ID：这是针对非 Amazon GameLift Servers 资源的 VPC。
   + Amazon GameLift Servers AWS 账户 ID — 这是您用来管理Amazon GameLift Servers车队的账户。

   授权 VPC 对等连接后，授权将在 24 小时内保持有效，除非您将其撤销。您可以使用以下操作管理您的 VPC 对等连接授权：
   + [DescribeVpcPeeringAuthorizations()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeVpcPeeringAuthorizations.html) (AWS CLI`describe-vpc-peering-authorizations`)。
   + [DeleteVpcPeeringAuthorization()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DeleteVpcPeeringAuthorization.html) (AWS CLI`delete-vpc-peering-authorization`)。

1. 

**请求对等连接。**

   使用有效授权，您可以请求 Amazon GameLift Servers 建立对等连接。

   要请求 VPC 对等互连，请调用服务 API [CreateVpcPeeringConnection()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_CreateVpcPeeringConnection.html) 或使用 AWS CLI 命令`create-vpc-peering-connection`。使用管理您的 Amazon GameLift Servers 游戏服务器的账户发出此调用。使用以下信息来确定要 VPCs 对等的两个：
   + 对等 VPC ID 和 AWS 账户 ID — 这是您的非Amazon GameLift Servers资源的 VPC，也是您用来管理这些资源的账户。VPC ID 必须与有效对等授权上的 ID 匹配。
   + 实例集 ID：此信息标识您的 Amazon GameLift Servers 游戏服务器的 VPC。

1. 

**跟踪对等连接状态。**

   请求 VPC 对等连接是一个异步操作。要跟踪对等请求的状态并处理成功或失败的案例，请使用以下选项之一：
   + 使用 `DescribeVpcPeeringConnections()` 持续轮询。此操作将检索 VPC 对等连接记录，包括请求的状态。如果已成功创建对等连接，则连接记录也包含分配给 VPC 的私有 IP 地址的 CIDR 块。
   + 使用 [DescribeFleetEvents()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeFleetEvents.html) 处理与 VPC 对等连接相关的队列事件，包括成功和失败事件。

建立对等连接后，您可以立即使用以下操作对其进行管理：
+ [DescribeVpcPeeringConnections()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeVpcPeeringConnections.html) (AWS CLI`describe-vpc-peering-connections`)。
+ [DeleteVpcPeeringConnection()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DeleteVpcPeeringConnection.html) (AWS CLI`delete-vpc-peering-connection`)。

## 使用新实例集设置 VPC 对等连接
<a name="fleets-creating-aws-cli-vpc"></a>

您可以创建一个新 Amazon GameLift Servers 队组，同时请求 VPC 对等连接。

1. 

**获取 AWS 账户 ID 和凭证。**

   您需要以下两个 AWS 账户的 ID 和登录凭证。您可以 IDs 通过登录[AWS 管理控制台](https://console.aws.amazon.com/)并查看您的账户设置来找到 AWS 账户。要获取凭证，请转到 IAM 控制台。
   + AWS 用于管理Amazon GameLift Servers游戏服务器的帐户。
   + AWS 用于管理非Amazon GameLift Servers资源的帐户。

   如果您对 Amazon GameLift Servers 和非 Amazon GameLift Servers 资源使用同一账户，则仅需该账户的 ID 和凭证。

1. 

**获取您的非Amazon GameLift Servers AWS 资源的 VPC ID。**

   如果您还没有为这些资源创建 VPC，请现在创建（请参阅 [Amazon VPC 入门](https://docs.aws.amazon.com/vpc/latest/userguide/getting-started-ipv4.html)）。请确保您在计划创建新实例集的同一区域中创建新的 VPC。如果您的非Amazon GameLift Servers资源在与您使用的 AWS 账户或 user/user 组不同的账户或组下管理Amazon GameLift Servers，则在下一步中请求授权时，您需要使用这些账户凭证。

   创建 VPC 后，您可以通过查看自己的，在 Amazon VPC 控制台中找到 VPC ID VPCs。

1. 

**使用非 Amazon GameLift Servers 资源授权 VPC 对等连接。**

   当 Amazon GameLift Servers 创建新队组和对应的 VPC 时，它还会发送请求，以便与您的非 Amazon GameLift Servers 资源的 VPC 建立对等连接。您需要预先对该请求进行授权。此步骤将更新您的 VPC 的安全组。

   使用管理非Amazon GameLift Servers资源的账户凭证，调用服务 API [ CreateVpcPeeringAuthorization()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_CreateVpcPeeringAuthorization.html) 或使用 AWS CLI 命令`create-vpc-peering-authorization`。确定以下信息：
   + 对等 VPC ID：包含您的非 Amazon GameLift Servers 资源的 VPC 的 ID。
   + Amazon GameLift Servers AWS 账户 ID — 用于管理Amazon GameLift Servers车队的账户 ID。

   授权 VPC 对等连接后，授权将在 24 小时内保持有效，除非您将其撤销。您可以使用以下操作管理您的 VPC 对等连接授权：
   + [DescribeVpcPeeringAuthorizations()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeVpcPeeringAuthorizations.html) (AWS CLI`describe-vpc-peering-authorizations`)。
   + [DeleteVpcPeeringAuthorization()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DeleteVpcPeeringAuthorization.html) (AWS CLI`delete-vpc-peering-authorization`)。

1. 按照说明[使用 AWS CLI 创建新队列](fleets-creating.md)。包括以下其他参数：
   + *peer-vpc-aws-account-i* d — 您用于使用非Amazon GameLift Servers资源管理 VPC 的账户的 ID。
   + *peer-vpc-id*— 使用您的非Amazon GameLift Servers账户的 VPC 的 ID。

使用 VPC 对等参数成功调用 [create-fleet](https://docs.aws.amazon.com/cli/latest/reference/gamelift/create-fleet.html) 后将会生成一个新实例集和一个新 VPC 对等请求。该实例集的状态设置为 **New**，并且将启动实例集激活过程。对等连接请求的状态设置为 **initiating-request**。您可以通过调[describe-vpc-peering-connections](https://docs.aws.amazon.com/cli/latest/reference/gamelift/describe-vpc-peering-connections.html)用来跟踪对等互连请求的成功或失败。

在同时请求新实例集和 VPC 对等连接时，两个操作要么成功，要么失败。如果某个实例集在创建过程中失败，则不会建立 VPC 对等连接。同样，如果 VPC 对等连接由于任何原因失败，则新实例集将无法从 **Activating** 状态变为 **Active** 状态。

**注意**  
新的 VPC 对等连接直到实例集准备好变为活动状态才能完成。这意味着连接不可用，且无法在游戏服务器构建安装过程中使用。

以下示例创建一个新实例集，并在预先建立的 VPC 和新实例集的 VPC 之间创建对等连接。预先建立的 VPC 由您的非Amazon GameLift Servers AWS 账户 ID 和 VPC ID 的组合进行唯一标识。

```
$ AWS gamelift create-fleet
    --name "My_Fleet_1"
    --description "The sample test fleet"
    --ec2-instance-type "c5.large"
    --fleet-type "ON_DEMAND"
    --build-id "build-1111aaaa-22bb-33cc-44dd-5555eeee66ff"
    --runtime-configuration "GameSessionActivationTimeoutSeconds=300,
                             MaxConcurrentGameSessionActivations=2,
                             ServerProcesses=[{LaunchPath=C:\game\Bin64.dedicated\MultiplayerSampleProjectLauncher_Server.exe,
                                               Parameters=+sv_port 33435 +start_lobby,
                                               ConcurrentExecutions=10}]"
    --new-game-session-protection-policy "FullProtection"
    --resource-creation-limit-policy "NewGameSessionsPerCreator=3,
                                      PolicyPeriodInMinutes=15"
    --ec2-inbound-permissions "FromPort=33435,ToPort=33435,IpRange=0.0.0.0/0,Protocol=UDP" 
                              "FromPort=33235,ToPort=33235,IpRange=0.0.0.0/0,Protocol=UDP"
    --metric-groups  "EMEAfleets"
    --peer-vpc-aws-account-id "111122223333"
    --peer-vpc-id "vpc-a11a11a"
```

*可复制版本：*

```
AWS gamelift create-fleet --name "My_Fleet_1" --description "The sample test fleet" --fleet-type "ON_DEMAND" --metric-groups "EMEAfleets" --build-id "build-1111aaaa-22bb-33cc-44dd-5555eeee66ff" --ec2-instance-type "c5.large" --runtime-configuration "GameSessionActivationTimeoutSeconds=300,MaxConcurrentGameSessionActivations=2,ServerProcesses=[{LaunchPath=C:\game\Bin64.dedicated\MultiplayerSampleProjectLauncher_Server.exe,Parameters=+sv_port 33435 +start_lobby,ConcurrentExecutions=10}]" --new-game-session-protection-policy "FullProtection" --resource-creation-limit-policy "NewGameSessionsPerCreator=3,PolicyPeriodInMinutes=15" --ec2-inbound-permissions "FromPort=33435,ToPort=33435,IpRange=0.0.0.0/0,Protocol=UDP" "FromPort=33235,ToPort=33235,IpRange=0.0.0.0/0,Protocol=UDP" --peer-vpc-aws-account-id "111122223333" --peer-vpc-id "vpc-a11a11a"
```

## VPC 对等连接问题疑难解答
<a name="vpc-peering-troubleshooting"></a>

如果您在为 Amazon GameLift Servers 游戏服务器建立 VPC 对等连接时遇到问题，请考虑以下常见的根本原因：
+ 未找到对所请求连接的授权：
  + 检查非 Amazon GameLift Servers VPC 的 VPC 授权状态。它可能不存在或可能已过期。
  + 检查 VPCs 您要对等的两个区域的区域。如果它们不在同一个区域中，则无法建立对等连接。
+ 您的两 VPCs 个 CIDR 块（请参阅[无效的 VPC 对等连接配置](https://docs.aws.amazon.com/vpc/latest/peering/invalid-peering-configurations.html#overlapping-cidr)）重叠。分配给对等设备的 IPv4 CIDR 块 VPCs 不能重叠。系统会自动为 Amazon GameLift Servers 实例集的 VPC 分配 CIDR 数据块且您无法更改此数据块，因此，您需要为非 Amazon GameLift Servers 资源更改 VPC 的 CIDR 数据块。要解决此问题，请执行以下操作：
  + 通过调用 `DescribeVpcPeeringConnections()` 查找 Amazon GameLift Servers 队组的此 CIDR 块。
  + 转到 Amazon VPC 控制台，查找非 Amazon GameLift Servers 资源的 VPC，然后更改 CIDR 块，以使它们不会重叠。
+ 新实例集未激活（当请求与新实例集建立 VPC 对等连接时）。如果新实例集未能进入**活动**状态，则没有要与之建立对等连接的 VPC，因此对等连接无法成功。

# 玩家会话和对战自定义
<a name="customize-player-sessions-matchmaking"></a>

借助玩家会话和对战自定义设置，您可以开发复杂的玩家管理工作流，包括精细的对战系统，助力打造公平且引人入胜的多人游戏体验。

# 生成玩家 ID
<a name="player-sessions-player-identifiers"></a>

Amazon GameLift Servers 使用玩家会话来表示已连接到游戏会话的玩家。当玩家通过与 Amazon GameLift Servers 集成的游戏客户端连接到游戏会话时，Amazon GameLift Servers 会创建一个玩家会话。当玩家离开游戏时，玩家会话随之结束。Amazon GameLift Servers 不会重复使用玩家会话。

**重要**  
使用 FlexMatch 对战时，如果您创建的新对战请求包含已存在于现有有效对战请求中的玩家 ID，则现有请求将被自动取消。但是，系统不会为被取消的请求发送 `MatchmakingCancelled` 事件。要监控现有对战请求的状态，请使用 [DescribeMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeMatchmaking.html) 以不频繁的间隔（30-60 秒）轮询请求状态。被取消的请求将显示状态为 `CANCELLED`，原因标记为 `Cancelled due to duplicate player`。

以下示例代码会随机生成唯一的玩家 ID：

```
bool includeBrackets = false;
bool includeDashes = true;
string playerId = AZ::Uuid::CreateRandom().ToString<string>(includeBrackets, includeDashes);
```

有关玩家会话的更多信息，请参阅[Amazon GameLift Servers 控制台中的游戏和玩家会话](gamelift-console-game-player-sessions-metrics.md)。

# 为 Amazon GameLift Servers 添加 FlexMatch 对战
<a name="gamelift-match-intro"></a>

使用 Amazon GameLift Servers FlexMatch 为 Amazon GameLift Servers 托管的游戏添加玩家对战功能。您可以将 FlexMatch 与自定义游戏服务器或 Amazon GameLift Servers Realtime 搭配使用。

FlexMatch 可将对战服务与自定义规则引擎搭配使用。您可以根据玩家属性以及适合您游戏的模式来设计玩家匹配方式。FlexMatch 则管理实际的匹配流程，包括评估正在寻找游戏的玩家、组建单队或多队对战组合，以及启动游戏会话以托管这些对战。

要使用完整 FlexMatch 服务，您必须将托管资源设置为队列。Amazon GameLift Servers 使用队列来为跨多个地区和计算类型的游戏找到尽可能好的托管位置。特别是，Amazon GameLift Servers 队列可以使用游戏客户端提供的延迟数据来放置游戏会话，以便玩家在玩游戏时体验到尽可能低的延迟。

有关 FlexMatch 的更多信息，包括将对战集成到游戏中的详细帮助，请参阅以下 [Amazon GameLift Servers FlexMatch 开发人员指南](https://docs.aws.amazon.com/gamelift/latest/flexmatchguide/)主题：
+ [Amazon GameLift Servers FlexMatch 的工作原理](https://docs.aws.amazon.com/gamelift/latest/flexmatchguide/match-intro.html)
+ [FlexMatch 集成步骤](https://docs.aws.amazon.com/gamelift/latest/flexmatchguide/match-tasks.html)

# 游戏会话放置自定义
<a name="customize-game-session-placement"></a>

借助游戏会话放置自定义设置，您可以对放置系统进行微调，从而为玩家群体提供尽可能最佳的游戏体验。您还可以根据玩家的兼容性和偏好来优化放置，同时兼顾运营层面的考量因素，例如成本效益、地理分布以及从服务中断恢复的能力。

# 自定义游戏会话队列
<a name="queues-design"></a>

本主题介绍如何自定义游戏会话队列，以实现最优的游戏会话放置决策。有关游戏会话队列及其工作原理的更多信息，请参阅[配置游戏会话放置](queues-intro.md)。

这些 Amazon GameLift Servers 功能需要队列支持：
+ [使用 FlexMatch 对战](https://docs.aws.amazon.com/gameliftservers/latest/flexmatchguide/match-tasks.html)
+ [为竞价型实例构建队列](spot-tasks.md)

**Topics**
+ [定义队列的范围](queues-design-scope.md)
+ [建立多位置队列](queues-design-multiregion.md)
+ [评估队列指标](queues-design-metrics.md)

# 定义队列的范围
<a name="queues-design-scope"></a>

您的游戏的玩家群体中可能有一群不应该一起玩的玩家。例如，如果您以两种语言发布游戏，则每种语言都应有自己的游戏服务器。

要为您的玩家群体设置游戏会话位置，请为每个玩家区段创建一个单独的队列。确定每个队列的范围，将玩家放到正确的游戏服务器中。确定队列范围的一些常见方法包括：
+ **按地理位置划分。**在多个地理区域部署游戏服务器时，您可以为每个位置的玩家建立队列以减少玩家延迟。
+ **按版本或脚本变体排列。**如果您的游戏服务器有多个变体，则可能支持无法在同一游戏会话中玩游戏的玩家组。例如，游戏服务器版本或脚本可能支持不同的语言或设备类型。
+ **按事件类型划分。**您可以创建一个特殊队列来管理锦标赛或其他特殊活动的参与者的游戏。

## 设计多个队列
<a name="queues-design-players"></a>

根据您的游戏和玩家，您可能需要创建多个游戏会话队列。当游戏客户端或客户端服务请求新游戏会话时，它指定用于放置的队列。为了帮助您确定是否使用多个队列，请考虑：
+ 游戏服务器的变体。您可以为游戏服务器的每个变体创建单独的队列。队列中的所有实例集都必须部署兼容的游戏服务器。这是因为使用队列加入游戏的玩家必须能够在队列的任何游戏服务器上玩游戏。
+ 不同的玩家群体。您可以根据玩家群体自定义 Amazon GameLift Servers 如何放置游戏会话。例如，您可能需要为某些需要特殊实例类型或运行时配置的游戏模式自定义队列。或者，您可能需要一个特殊的队列来管理锦标赛或其他赛事的排名。
+ 游戏会话队列指标。您可以根据想要如何收集游戏会话展示位置指标来设置队列。有关更多信息，请参阅 [Amazon GameLift Servers 队列指标](monitoring-cloudwatch.md#gamelift-metrics-queue)。

# 建立多位置队列
<a name="queues-design-multiregion"></a>

我们建议所有队列都采用多位置设计。这种设计可以提高放置速度和托管弹性。需要采用多位置设计，才能使用玩家延迟数据让玩家以最小的延迟进入游戏会话。如果您要构建使用竞价型实例队列的多位置队列，请按照中的说明进行操作。[借助竞价型实例集降低游戏托管成本](fleets-spot.md)

创建多位置队列的一种方法是将多位置队列添加到[队](gamelift-regions.md#gamelift-regions-hosting)列中。这样，队列就可以在实例集的任何位置放置游戏会话。您还可以添加其他具有不同配置或总部位置的实例集以实现冗余。如果您使用的是多位置竞价型实例队列，请遵循最佳实操，并包括具有相同位置的按需型实例队列。

以下示例概述了设计基本多位置队列的过程。在此示例中，我们使用两个队列：一个竞价型实例队列和一个按需型实例队列。每个舰队都有以下 AWS 区域 放置位置：`us-east-1``us-east-2`、`ca-central-1`、和`us-west-2`。

**使用多位置实例集创建基本的多位置队列**

1. 选择要在其中创建队列的位置。您可以将队列放在部署客户端服务位置附近的位置，从而最大限度地减少请求延迟。在此示例中，我们在中的队列在中的位置`us-east-1`。

1. 创建新队列并将我们的实例集添加为队列目标。目标顺序决定了 Amazon GameLift Servers 如何放置游戏会话。在此示例中，我们首先列出了竞价型实例队列，然后列出了按需型实例队列。

1. 定义队列的游戏会话放置优先顺序。此顺序决定队列首先在哪里搜索可用的游戏服务器。在此示例中，我们使用默认的优先顺序。

1. 定义位置顺序。如果您未定义位置顺序，Amazon GameLift Servers 会按字母顺序使用这些位置。

![\[一个控制台屏幕截图，展示了示例队列的位置和目标顺序。\]](http://docs.aws.amazon.com/zh_cn/gameliftservers/latest/developerguide/images/queue-multi-location-1.png)


![\[一个控制台屏幕截图，展示了示例队列的放置优先级和位置顺序。\]](http://docs.aws.amazon.com/zh_cn/gameliftservers/latest/developerguide/images/queue-multi-location-2.png)


# 评估队列指标
<a name="queues-design-metrics"></a>

使用指标来评估您的队列的执行情况。您可以在 [Amazon GameLift Servers 控制台](https://console.aws.amazon.com/gamelift)或 Amazon CloudWatch 中查看与队列相关的指标。有关队列指标的列表和说明，请参阅[Amazon GameLift Servers 队列指标](monitoring-cloudwatch.md#gamelift-metrics-queue)。

队列指标可以提供有关以下内容的见解：
+ **队列总体性能**-队列指标表明队列响应放置请求的成功程度。这些指标还可以帮助您确定展示位置失败的时间和原因。对于具有手动缩放队列的队列，`AverageWaitTime`和`QueueDepth`指标可以指示何时应调整队列的容量。
+ **FleetIQ 算法性能** – 对于使用 FleetIQ 算法的放置请求，指标显示该算法找到理想游戏会话放置位置的频率。展示位置可以优先使用玩家延迟最低的资源或成本最低的资源。此外，还有错误指标可识别导致 Amazon GameLift Servers 无法找到理想放置位置的常见原因。有关指标的更多信息，请参阅 [Amazon GameLift Servers使用 Amazon 进行监控 CloudWatch](monitoring-cloudwatch.md)。
+ **特定位置的展示**位置-对于多位置队列，指标会按位置显示成功展示位置。对于采用 FleetIQ 算法的队列，此数据提供对玩家活动出现位置的有用见解。

评估 FleetIQ 性能的指标时，请考虑以下提示：
+ 要跟踪队列寻找理想放置位置的速度，请结合使用 `PlacementsSucceeded` 指标与 FleetIQ 指标，以实现最低延迟和最低价格。
+ 要提高队列寻找理想位置的速度，请查看以下错误指标：
  + 如果`FirstChoiceOutOfCapacity`为高，请调整队列队列的容量扩展。
  + 如果`FirstChoiceNotViable`错误指标很高，请查看您的竞价型实例队列。当特定实例类型的中断率太高时，竞价型实例被认为“不可行”。要解决此问题，请更改队列以使用具有不同实例类型的竞价型实例集。我们建议您在每个位置加入具有不同实例类型的竞价型实例队列。

# 优先考虑游戏会话放置
<a name="queues-design-priority"></a>

Amazon GameLift Servers 采用算法来确定如何对队列的目标进行优先级排序，并决定新游戏会话的放置位置。该算法基于一组有序的标准。您可以使用默认的优先顺序，也可以自定义顺序。您可以随时编辑队列的优先级顺序。

**默认优先顺序**

1. **延迟** – 如果游戏会话放置请求包含玩家特定位置的延迟数据，则 Amazon GameLift Servers 会计算每个位置的玩家平均延迟，并尝试将游戏会话放置在平均值最低的实例集位置。

1. **成本** – 如果请求未包含延迟数据，或者多个实例集的延迟时间相等，则 Amazon GameLift Servers 会评估每个实例集的托管成本。实例集托管成本因实例集类型（竞价型或按需型）、实例类型及位置而异。

1. **目标** – 如果多个实例集具有相同的延迟和成本，则 Amazon GameLift Servers 会根据队列配置中列出的目标顺序对实例集进行优先级排序。

1. **位置** – 对于拥有多位置实例集的队列，如果所有其他标准都相同，则 Amazon GameLift Servers 会根据字母顺序对实例集的位置进行优先级排序。

## 自定义队列对游戏会话放置的优先级排序方式
<a name="queues-design-priority-custom"></a>

您可以选择自定义队列对放置标准的优先级排序方式。该队列将对接收到的所有游戏会话放置请求应用自定义优先级排序。

**注意**  
如果您创建自定义优先级配置时未包含全部四个标准，则 Amazon GameLift Servers 会自动按默认顺序追加所有缺失的标准。

**自定义队列的优先级配置**

使用 [Amazon GameLift Servers 控制台](https://console.aws.amazon.com/gamelift/)或 AWS Command Line Interface （AWS CLI）创建自定义优先级配置。

------
#### [ Console ]

在 [Amazon GameLift Servers 控制台](https://console.aws.amazon.com/gamelift/)中，您可以在创建新队列或更新现有队列时自定义队列的优先级。选择要工作的 AWS 区域。

打开控制台左侧导航栏并选择**队列**。在“队列”页面中，选择现有队列并选**编辑**。

1. 转到**游戏会话放置优先级**部分。拖放每个优先级标准以创建所需顺序。

1. 转到**位置顺序**部分。添加您想要确定其优先级的任何位置。当队列中有多个位置的实例集时，此列表非常有用。您至少必须指定一个位置。在此处指定的位置将优先处理，随后处理队列目标中的所有其他位置。

1. 选择**保存更改**。

------
#### [ AWS CLI ]

使用带有`--priority-configuration`选项的[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/gamelift/update-game-session-queue.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/gamelift/update-game-session-queue.html)命令来自定义队列的优先级顺序。 Amazon GameLift Servers更新当前默认 AWS 区域中的队列，或者您可以添加`--region`标签以指定其他 AWS 区域。

以下示例请求将为指定队列添加或更新优先级配置

```
aws gamelift update-game-session-queue \ 
    --name "example-queue-with-priority"
    --priority-configuration PriorityOrder="COST','LOCATION","DESTINATION",LocationOrder="us-east-1","us-east-2","ca-central-1","us-west-2" \
```

------

## 按玩家延迟确定放置优先级
<a name="queues-design-priority-custom-latency"></a>

如果您想为玩家提供最佳的玩家体验并确保将延迟降至最低，请在设置游戏会话放置系统时采取以下步骤：
+ 在选择放置游戏会话的位置时，将您的队列设置为优先考虑延迟。默认情况下，延迟位于优先级列表的顶端。您还可以自定义队列的优先级配置，并选择按优先级顺序排列延迟的位置。
+ 为您的队列设置玩家延迟策略。延迟策略允许您对游戏会话放置中允许的延迟量设置硬性限制。如果 Amazon GameLift Servers 无法在不超过限制的情况下放置游戏会话，则放置请求将超时并失败。您可以设置单个延迟策略，也可以创建一系列随着时间的推移逐渐放宽延迟限制的策略。通过一系列策略，您可以指定极低的初始延迟限制，并且在短暂延迟后仍然可以容纳延迟较高的玩家。有关创建延迟策略的详细信息，请参阅[创建玩家延迟政策](queues-design-latency.md)。
+ 在提出游戏会话放置请求时（参见 [StartGameSessionPlacement](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_StartGameSessionPlacement.html)），请包括每位玩家的延迟数据。玩家延迟数据包含游戏会话可能放置的每个可能位置的对应数值。例如，对于将游戏会话置于 us-ea AWS 区域 st-2 和 ca-central-1 中的队列，延迟数据可能如下所示：

  ```
  "PlayerLatencies": [ 
      { "LatencyInMilliseconds": 100, "PlayerId": "player1", "RegionIdentifier": "us-east-2" },
      { "LatencyInMilliseconds": 100, "PlayerId": "player1", "RegionIdentifier": "ca-central-1" },
      { "LatencyInMilliseconds": 150, "PlayerId": "player2", "RegionIdentifier": "us-east-2" },
      { "LatencyInMilliseconds": 150, "PlayerId": "player2", "RegionIdentifier": "ca-central-1" }
    ]
  ```

  要获得准确的延迟测量值，请使用 Amazon GameLift Servers 的 UDP ping 信标。这些端点使您能够测量玩家设备与每个潜在托管位置之间的实际 UDP 网络延迟，从而比使用 ICMP ping 更准确地做出放置决策。有关使用 UDP ping 信标测量延迟的更多信息，请参阅 [UDP ping 信标](reference-udp-ping-beacons.md)。

## 按位置确定放置优先级
<a name="queues-design-priority-custom-location"></a>

您可以配置队列，使其根据地理位置优先级列表放置游戏会话。位置是队列决定新游戏会话放置位置的标准之一。默认情况下，位置的优先级排在延迟、成本和目标之后，位列第四。

对于游戏会话放置，目标和位置具有略微不同的含义：
+ *目标*是指特定的实例集，包含该实例集的所有托管资源（无论部署于何处）。按目标确定优先级时，Amazon GameLift Servers 可能会将会话放置到实例集内的任何位置。多位置托管式实例集和 Anywhere 实例集的托管资源可部署于一个或多个位置。
+ *位置*是指实例集托管资源部署的具体地理位置。一个队列可以有多个位置，其中可能包括 AWS 区域 Local Zones 或自定义位置（对于 Anywhere 队列）。单位置托管式实例集仅有一个位置，且该位置始终为 AWS 区域。多位置实例集有一个主区域，并可包含远程位置。Anywhere 实例集有一个或多个自定义位置。

按位置确定放置优先级时，Amazon GameLift Servers 会查找包含优先级位置的所有队列目标，然后在其中搜索可用的托管资源。如果存在多个包含优先级位置的目标，则 Amazon GameLift Servers 会转而采用下一个优先级标准（成本、延迟、目标）。

您可以通过多种方式影响队列位置的优先级排序 
+ 配置队列处理所有游戏会话放置请求的方式：
  + **向队列添加优先级配置。**队列的优先级配置包括位置的有序列表。您可以指定一个或多个位置来确定其优先级。此列表不会排除任何位置，仅告知 Amazon GameLift Servers 会优先在哪些位置查找可用的托管资源。有序位置列表的一个常见用途是：当您希将大部分流量导入到一个或多个特定的地理位置，同时将其他位置作为备份容量时。通过调用添加优先级配置[UpdateGameSessionQueue](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_UpdateGameSessionQueue.html)。
  + **向队列添加筛选条件配置。**筛选条件配置是队列的允许列表。它指示 Amazon GameLift Servers 在寻找可用的托管资源时忽略列表之外的所有位置。筛选条件配置有两种常见用途。首先，对于具有多个位置的实例集，您可以使用筛选条件来排实例集内的某些位置。其次，在某个位置出现暂时性问题时，您可能希望暂时禁止在该位置上放置。由于您可以随时更新队列的筛选条件配置，因此可以根据需要轻松添加和移除位置。通过调用添加过滤器配置[UpdateGameSessionQueue](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_UpdateGameSessionQueue.html)。
+ 使用特殊指令处理个别放置请求：
  + **在游戏会话放置请求中包含优先级覆盖列表。**您可以根据任何[StartGameSessionPlacement](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_StartGameSessionPlacement.html)请求提供备用优先位置列表。此列表仅对本次请求生效，将覆盖队列中配置的位置优先级，且不会影响任何其他请求。此覆盖功能需满足以下要求：
    + 仅当队列已设置优先级配置且将 `LOCATION` 设为第一个优先级时，才使用覆盖列表。
    + 请勿在同一放置请求中包含玩家延迟数据。包含延迟数据会在对位置进行优先级排序时引发冲突，而 Amazon GameLift Servers 无法解决此类冲突。
    + 设定当 Amazon GameLift Servers 在优先级覆盖列表中找不到可用的资源时的处理方式。您可以选择回退到队列的其他位置，也可以将放置范围限制在覆盖列表内。默认情况下，Amazon GameLift Servers 会回退以尝试放置在队列的其他位置。
    + 根据需要更新队列的筛选条件配置，例如在覆盖列表中添加位置。覆盖列表不会使筛选条件列表失效。

# 创建玩家延迟政策
<a name="queues-design-latency"></a>

如果您的放置请求包含玩家延迟数据，则 Amazon GameLift Servers 会为所有玩家寻找平均延迟最低的位置中的游戏会话。基于玩家平均延迟放置游戏会话时，Amazon GameLift Servers 会避免将大多数玩家放置到高延迟的游戏中。但 Amazon GameLift Servers 仍会为延迟极高的玩家进行放置。为了容纳这些玩家，请制定玩家延迟策略。

玩家延迟策略可防止 Amazon GameLift Servers 在任意位置放置请求的游戏会话，以免请求中的玩家体验到的延迟超过设定最大值。玩家延迟策略还可以阻止 Amazon GameLift Servers 将游戏会话请求与延迟较高的玩家进行匹配。

**提示**  
要管理特定于延迟的规则（例如要求组内所有玩家保持相似的延迟），您可以使用 [https://docs.aws.amazon.com/gameliftservers/latest/flexmatchguide/match-intro.html](https://docs.aws.amazon.com/gameliftservers/latest/flexmatchguide/match-intro.html) 来创建基于延迟的对战规则。

例如，假设这个队列的超时时间为 5 分钟，并且有以下玩家延迟策略：

1. 花费 120 秒钟搜索所有玩家延迟均低于 50 毫秒的目标，然后...

1. 花费 120 秒钟搜索所有玩家延迟均低于 100 毫秒的目标，然后...

1. 花费剩余的队列超时时间搜索所有玩家延迟均低于 200 毫秒的目标。

![\[一个控制台屏幕截图，展示了逐渐放宽的示例延迟策略。\]](http://docs.aws.amazon.com/zh_cn/gameliftservers/latest/developerguide/images/queue-latency-policy.png)


# 为竞价型实例构建队列
<a name="spot-tasks"></a>

通过使用竞价型实例集，您可以大幅节省托管成本。有关竞价型实例集及其使用方法的更多详细信息，请参阅[按需型实例和竞价型实例](gamelift-compute.md#gamelift-compute-spot)。

如果您的游戏托管解决方案包括竞价型实例集，则必须使用游戏会话放置队列。Amazon GameLift Servers 使用队列在多个游戏托管资源中进行搜索，并选择最佳资源来托管新游戏会话。对于竞价型实例集，队列对于最大限度地降低托管成本和避免竞价型实例可能出现的中断尤为重要。本主题可帮助您设置弹性队列，即使出现中断、减速和故障，该队列也可以继续为玩家托管游戏。您可以根据多个因素（包括托管成本），自定义队列如何确定可用托管资源的优先级。

您是否在使用 FlexMatch 进行对战？ 您可以将队列与竞价型实例集配合使用，以便进行对战游戏会话放置。

## 实施竞价型实例集任务
<a name="spot-tasks-queue"></a>

在创建或更新您的游戏托管解决方案以便使用竞价型实例集时，请完成以下任务。有关如何构建可优化竞价型实例可用性和弹性的队列的更多详细指南，请参阅[借助竞价型实例集降低游戏托管成本](fleets-spot.md)。

1. **为您的游戏会话队列选择并创建一组实例集目标。**

   首先决定您想让队列放置游戏会话的位置。队列可以在多个实例集中搜索以找到最佳位置。每个实例集仅包含一种实例类型，但可覆盖多个地理位置。如果队列关联的实例集在位置和实例类型上均具备多样性，则更有可能实现成功的游戏会话放置。请参阅这些最佳实践，了解如何设计有效且具有弹性的竞价型实例优化队列。

1. **创建针对竞价型实例优化的游戏会话队列。**

   创建队列并针对您的竞价型实例集进行配置。请参阅[创建游戏会话队列](queues-creating.md)以帮助您创建和配置新队列。您可以使用Amazon GameLift Servers控制台或 AWS CLI 来创建或编辑队列。
   + 添加步骤 1 中的实例集目标位置。
   + 根据需要确定目标位置的优先顺序。默认情况下，Amazon GameLift Servers 会优先按成本排序，其次才考虑目标区域，因此仅当不同区域间的最低成本相同时，才会根据目标区域顺序进行分配。
   + 如果您希望将游戏托管成本的优先级置于玩家延迟之上，请提供自定义放置优先级。请参阅[优先考虑游戏会话放置](queues-design-priority.md)。

1. **更新解决方案中的其他组件以使用新队列。**

   当您的解决方案使用针对竞价型实例优化的队列来启动新的游戏会话时，队列会自动避免将游戏会话置于中断可能性很高的实例集中。相反，它会在所有可行的实例集中搜索与您定义的优先级相匹配的资源，包括玩家延迟、托管成本和目的地顺序。
   + 如果您未使用 FlexMatch：更新您的后端服务，以在游戏会话请求中指定新的竞价型实例优化队列。后端服务代表您的游戏客户端（使用 `StartGameSessionPlacement()`）向 Amazon GameLift Servers 发出 API 请求，并且每个请求都必须指定队列名称。要获得在游戏客户端中实施游戏会话放置的帮助，请参阅[创建游戏会话](gamelift-sdk-client-api.md#gamelift-sdk-client-api-create)。
   + 如果您使用了 FlexMatch：更新您的对战配置，将游戏会话请求发送到新的竞价型实例优化队列。当对战系统形成玩家匹配时，它会向指定队列发送游戏会话放置请求，以开始该对战的新游戏会话。只有 FlexMatch 模式设置为“托管”的对战配置才能指定放置队列。您可以使用 AWS CLI 或Amazon GameLift Servers控制台更新配对配置（参见[编辑配对配置](https://docs.aws.amazon.com/gameliftservers/latest/flexmatchguide/match-create-configuration-edit.html)）。

1. **评估 竞价型实例集和队列的性能。**

   在Amazon GameLift Servers控制台中或通过 Amazon 查看Amazon GameLift Servers指标 CloudWatch 以查看绩效。有关 Amazon GameLift Servers 指标的更多信息，请参阅 [Amazon GameLift Servers使用 Amazon 进行监控 CloudWatch](monitoring-cloudwatch.md)。关键指标包括：
   + 中断率 – 使用 `InstanceInterruptions` 和 `GameSessionInterruptions` 指标跟踪实例和游戏会话的竞价型实例相关中断的数量和频率。回收实例的游戏会话的状态为 `TERMINATED`，状态原因为 `INTERRUPTED`。
   + 队列有效性 – 跟踪放置成功率、平均等待时间和队列深度，以确认竞价型实例集不会影响队列性能。
   + 实例集使用情况 – 监控有关实例、游戏会话和玩家会话的数据。按需型实例集的使用情况可以表明队列为了避免中断而避免放置到竞价型实例集中。

## 带有竞价型实例集的队列的最佳实操
<a name="queues-design-spot"></a>

 在为竞价型实例创建实例集和队列时，请使用以下最佳实践。
+ **扩大队列的地理覆盖范围。**即使你的玩家聚集在一个单一的队伍中 AWS 区域，也要将相邻的位置添加到你的竞技队伍中。这种方法提高了队列在区域减速、故障和竞价型实例中断期间保持容量的能力。多位置实例集适用于竞价型实例和按需型实例。
+ **使队列的实例类型覆盖范围多样化。**Amazon GameLift Servers 会根据实例类型评估竞价型实例可行性，因此拥有具有各种实例类型的竞价型实例集可以减少多个竞价型实例集同时不可用的可能性。至少包括两个竞价型实例集，每个位置的实例类型各不相同。
**注意**  
定价基于您使用的实例，而不是实例集的数量。运行五个队列，每个队列有 10 个实例，与运行 50 个成本相似的实例的实例集相同。定价因实例类型、大小和位置而异。

  对竞价型实例类型进行分组的提示：
  + 使用同一系列中的实例类型，例如 `m6g.medium`、`m6g.large` 和 `m6g.xlarge`。实例类型越大，成本越高，但也可以同时托管更多的游戏会话。
  + 选择广泛可用的实例类型。通常，旧一代系列（例如 C5、M5 和 R5）和常见规模（例如 .large、.xlarge 和 .2xlarge）具有更好的可用性。
  + 在 Amazon GameLift Servers 控制台中查看 30-90 天的定价历史记录。寻找可用性模式一致的实例类型。
  + 使用 Amazon GameLift Servers 控制台（实例集创建工具）来探索实例类型的位置覆盖范围。
+ **添加按需型实例集以获得备份容量。**每当竞价型实例集不可用时，游戏托管可以切换到按需型实例集。在每个位置至少放置一个按需型实例集以保持低玩家延迟。为您的备用按需型实例集添加自动扩缩功能，以便在不需要按需型实例集时缩减其规模。
+ **为所有实例集目的地分配别名。**为队列的每个目的地创建别名。别名可以让您在需要更换实例集时更轻松、更高效地操作。
+ **应用队列优先级策略。**您可以自定义队列如何确定游戏会话放置位置的优先顺序（有关更多详细信息，请参阅[优先考虑游戏会话放置](queues-design-priority.md)）。对于针对竞价型实例优化的队列，按成本划分优先级可确保尽可能使用低成本的竞价型实例集。

  您还可以通过指定目的地顺序来确定某些实例集的优先级。例如，一些用户指定一组主实例集供常规使用，并将一组辅助实例集指定为备用。在此情况下，将实例集的目标顺序设置为首先列出主实例集。然后，配置队列的优先顺序，先是目的地，然后是成本。

# 托管资源自定义
<a name="fleets-design"></a>

本节将介绍用于配置和管理 Amazon GameLift Servers 基础设施的高级选项，可协助您满足特定的性能、成本和运营要求。具体而言，本节主题将阐述如何自定义 Amazon GameLift Servers 托管式托管资源，以使其充分契合您的游戏及玩家需求。

需要考虑的决策包括：
+ 在何处为玩家部署托管资源？ 游戏延迟是选择实例集地理位置时的主要考量因素，但不同位置还存在其他差异因素，包括资源类型的可用性和成本。
+ 哪些 EC2 实例类型最能支持你的游戏？ 从可用的实例类型中进行选择，以使用计算架构、内存、存储和网络容量的最佳组合。
+ 您需要多大的实例类型？ 根据游戏服务器软件的资源需求（内存和 CPU）和其他因素选择实例类型大小。
+ 您的实例集应使用按需型实例还是竞价型实例？ 考虑您能否利用较低的竞价型实例定价，以及 Amazon GameLift Servers 能否充分降低竞价型实例中断对游戏会话的影响。
+ 您希望游戏服务器软件如何在每个实例集实例上运行？ 运行时配置会告知 Amazon GameLift Servers 要运行的服务器软件及其运行方式。
+ 对于容器实例集，默认配置是否适用于您的游戏？Amazon GameLift Servers 会为您完成容器实例集配置方面的大量优化工作，但您仍可自定义大多数配置设置。

# 为托管式实例集选择计算资源
<a name="gamelift-compute"></a>

对于 Amazon GameLift Servers 托管式托管（包括托管式 EC2 和托管容器），该服务会将您的游戏服务器部署到 AWS 云中的计算资源实例集。创建托管式实例集时，您需要配置最适合您游戏的托管资源。本主题讨论了选择和配置游戏托管式实例集时的关键决策点。

**注意**  
如果您要同时使用 Anywhere 和 Amazon GameLift Servers 托管式实例集构建混合解决方案，请使用这些主题来设计托管式实例集，以补充您自己的自管理资源。请参阅[为 Amazon GameLift Servers 部署托管实例集](fleets-intro.md)。

**Topics**
+ [地理位置](#gamelift-compute-location)
+ [操作系统](#gamelift-compute-os)
+ [实例类型](#gamelift-compute-instance)
+ [按需型实例和竞价型实例](#gamelift-compute-spot)
+ [服务配额](#gamelift-service-limits)

## 地理位置
<a name="gamelift-compute-location"></a>

考虑一下您计划部署游戏服务器的位置。通常，为提供最佳玩家体验，应将游戏服务器部署在尽可能靠近玩家的位置。对于托Amazon GameLift Servers管主机，您可以选择将游戏服务器放置在任何支持的区域 AWS 区域 和 Local Zones 中。如果您正在构建混合解决方案，请考虑托管式实例集部署如何能够补充您自行管理的 Amazon GameLift Servers Anywhere 实例集的部署位置。

对于大多数开发和测试场景，部署到单一位置即可满足需求。当您为游戏发布及后续运营做准备时，选择跨多个地理位置部署则具有多重优势，包括为广泛的玩家群体提供支持，以及提高游戏托管的整体弹性和可靠性。此外，多位置部署还能加快游戏会话放置速度，并在针对延迟和成本优化放置时提供更多选择，从而提升玩家体验。

有关 Amazon GameLift Servers 支持的位置列表以及关于所有实例集类型的位置的更多信息，请参阅 [Amazon GameLift Servers 服务位置](gamelift-regions.md)。

多位置实例集

单个托管式实例集可以将资源部署到多个位置。您可以针对多位置实例集中的每个独立位置，手动设置容量。

使用多位置实例集的优势：
+ 简化实例集部署和管理：您只需提供游戏服务器软件和实例集配置，然后 Amazon GameLift Servers 会将其部署到多个位置的实例集实例（一次构建，随处部署）。在生产实例集中，您可以查看和管理实例集中的所有位置，而不必管理位于不同区域的多个实例集。
+ 本地区域可用性-如果要使用本地区域，则必须创建多地点舰队，将 AWS 区域 总部位置和本地区域作为远程位置。Local Zones 是它的扩展 AWS 区域 ，可以为有需要的区域和客户提供更低的延迟。您可以将 Local Zones 添加到任何多位置实例集中；无需包括 Local Zones 的父 AWS 区域。
+ 与游戏会话队列兼容：您可以构建包含一个或多个多位置实例集的游戏会话放置队列。此方法使队列在优先选择和确定用于托管新游戏会话的位置时更具灵活性。
+ 高效的资源利用率：开启自动扩缩功能后，Amazon GameLift Servers 可以更好地优化实例集中所有位置的容量扩展。

使用多位置实例集的提示：
+ 查看每个 AWS 区域 或车队的位置数量的配额。请参阅 [Amazon GameLift Servers 服务限额](https://docs.aws.amazon.com/general/latest/gr/gamelift.html#limits_gamelift)。
+ 并非所有实例类型都在所有位置可用。实例类型选择可能有限，具体取决于您选择的位置。Amazon GameLift Servers 控制台提供了有用的工具，可帮助您在位置和实例类型之间找到适当的平衡。
+ 考虑使用 [UDP ping 信标](reference-udp-ping-beacons.md)来收集所有实例集位置的玩家延迟数据。Amazon GameLift Servers 可以使用这些数据来优化游戏会话以实现低延迟，并防止玩家加入延迟过高的会话。这些特殊端点接受 UDP 消息，而不是传统的 ICMP ping 消息，同时提供准确的延迟测量，有助于您选择最佳实例集位置。

## 操作系统
<a name="gamelift-compute-os"></a>

托管式实例集中的所有实例均使用亚马逊机器映像（AMI）进行部署，该映像可为游戏服务器软件提供完整的运行时环境。对于托管式 EC2 实例集，您可以在将游戏服务器生成包上传到 Amazon GameLift Servers 时指定生成包的操作系统。对于托管式容器实例集，您可以在容器组定义中指定操作系统。有关最新 AMI 版本的更多信息，请参阅[Amazon GameLift Servers AMI 版本](reference-ec2-ami-version-history.md)。

AMI 版本会定期更新。创建新实例集时，Amazon GameLift Servers 会分配您为游戏生成包选择的 AMI 的最新可用版本。部署在该实例集中的所有实例都使用相同的版本。要使您的 AMI 版本与最新的安全和软件更新保持同步，您需要定期更换实例集。作为最佳实践，我们建议每 30 天更换一次托管式实例集，以便为游戏服务器维护运行时环境。有关指南，请参阅[Amazon GameLift Servers 的安全最佳实践](security-best-practices.md)。

## 实例类型
<a name="gamelift-compute-instance"></a>

托管式实例集的实例类型决定了为所有实例集部署的硬件类型，并且实例类型通常有多种规格可供选择。所有 Amazon GameLift Servers 托管式实例集均使用 Amazon EC2 实例，并支持多种实例类型，这些类型提供了计算能力、内存、存储和网络性能的不同组合。实例类型的可用性因您选择的位置而异。

Amazon GameLift Servers 控制台提供了有用的工具，可帮助您找到适合游戏生成包和部署位置的正确实例类型。对于托管式容器实例集，控制台还提供有关游戏的 CPU 功率和内存要求的指导。

在为您的游戏选择可用实例类型时，请考虑：
+ 游戏服务器的计算架构：x64 或 Arm（AWS Graviton）。
**注意**  
Graviton Arm 实例需要一个针对 Linux AMI 的服务器生成包。C\$1\$1 和 C\$1 需要服务器软件开发工具包 5.1.1 或更高版本。Go 需要服务器软件开发工具包 5.0 或更高版本。这些实例不 out-of-the-box支持在亚马逊 Linux 2023 (AL2023) 或亚马逊 Linux 2 (AL2) 上安装 Mono。
+ 您的游戏服务器构建的计算、内存和存储要求。
+ 您的实例类型的大小。除了满足游戏服务器软件可执行文件的要求外，更大的实例类型还可以在每个实例上运行多个游戏服务器进程 and/or 容器。需要考虑的因素包括成本（运行少量大型实例与运行多个小型实例相比，哪种方案更经济）。还要考虑在实例集扩展事件期间，或关闭运行状况不佳的实例时，实例的增减可能会对游戏会话容量产生何种影响。如果每个实例同时运行多个游戏服务器进程，则添加或移除实例可能会严重影响游戏托管容量。

有关实例类型的更多信息，请参阅 [Amazon EC2 实例类型](https://aws.amazon.com/ec2/instance-types/)。

## 按需型实例和竞价型实例
<a name="gamelift-compute-spot"></a>

Amazon EC2 按需型实例和竞价型实例提供相同的硬件和性能，但它们在可用性和成本上有所不同。

**按需型实例**  
您始终可以在需要按需型实例时获取它并将它保存任意长的时间。按需型实例具有固定成本，意味着您只需为使用这些实例的时间量付费。无长期承诺。

**竞价型实例**  
通过利用未使用的 AWS 计算容量，竞价型实例可以为按需实例提供经济实惠的替代方案。竞价型实例的价格根据每个地点每种实例类型的供需情况而波动。 AWS 只要竞价型实例需要恢复容量，就可以在两分钟通知的情况下回收竞价型实例，并且在回收的实例上正在运行的游戏会话会被中断。

Amazon GameLift Servers 提供了多种工具，可帮助降低竞价型实例中断对您游戏会话造成影响的可能性。竞价可行性算法会跟踪实例类型的历史数据，以预测中断风险何时达到临界点，并避免在该类型的竞价型实例上放置新的游戏会话。如果确实发生了中断，您的游戏服务器可以使用通知正常结束玩家的游戏会话。

使用竞价型实例集托管游戏时，必须通过队列来放置游戏会话。队列可以根据竞价型实例集的可行性、成本和其他因素来确定游戏会话放置的优先级。有关如何利用竞价型实例托管游戏服务器的更多信息，请参阅以下主题：
+ [借助竞价型实例集降低游戏托管成本](fleets-spot.md)
+ [为竞价型实例构建队列](spot-tasks.md)

## 服务配额
<a name="gamelift-service-limits"></a>

您可以使用以下工具查看 Amazon GameLift Servers 的默认服务配额和 AWS 账户 的当前配额状态：
+ 有关 Amazon GameLift Servers 的通用服务配额信息，请参阅《AWS 一般参考》**中的 [Amazon GameLift Servers 端点和配额](https://docs.aws.amazon.com/general/latest/gr/gamelift.html)。
+ 要查看账户每个位置的可用实例类型列表，请打开 Amazon GameLift Servers 控制台的[服务配额](https://console.aws.amazon.com/gamelift/service-quotas)页面。该页面还会显示您的账户在每个位置的每种实例类型的当前使用情况。
+ 要查看您的账户当前每个区域的实例类型配额列表，请运行 AWS Command Line Interface (AWS CLI) 命令[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/gamelift/describe-ec2-instance-limits.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/gamelift/describe-ec2-instance-limits.html)。此命令返回您在默认区域（或您指定的其他区域）中拥有的活动实例数量。

准备启动游戏时，请在[Amazon GameLift Servers主机](https://console.aws.amazon.com/gamelift/)中填写发布问卷。Amazon GameLift Servers 团队使用发布问卷来确定您的游戏的正确配额和限制。

# 自定义 Amazon GameLift Servers 容器实例集
<a name="containers-design-fleet"></a>

本节主题介绍了 Amazon GameLift Servers 托管式容器的一些可选功能。您可以选择使用其中任意一项或全部功能。

**Topics**
+ [设置资源限制](#containers-design-fleet-limits)
+ [了解容器舰队的内存分配](#containers-design-fleet-memory-allocation)
+ [配置 NVMe 云端硬盘访问权限](#containers-design-fleet-nvme)
+ [指定必备容器](#containers-design-fleet-essential)
+ [配置网络连接](#containers-custom-network)
+ [为容器设置运行状况检查](#containers-design-fleet-health)
+ [设置容器依赖关系](#containers-design-fleet-dependencies)
+ [配置容器实例集](#containers-design-fleet-config)

## 设置资源限制
<a name="containers-design-fleet-limits"></a>

对于每个容器组，您可以确定容器组运行其软件所需的内存和计算能力。Amazon GameLift Servers 依靠这些信息来管理整个容器组的资源。它还使用这些信息来计算实例集映像可以容纳的游戏服务器容器组数量。此外，您也可以为各个容器设置限制。

您可以为容器组设置内存和计算能力的最大限制。默认情况下，这些资源由组内的所有容器共享。您可以通过为单个容器设置限制来进一步自定义资源管理。

**为单个容器设置可选限制**  
通过设置容器特定的资源限制，您可以更好地控制各个容器如何使用组内资源。如果未设置特定于容器的限制，则组内所有容器将共享组资源。这种共享方式能够更灵活地按需分配资源，但也可能导致进程间资源竞争，进而引发容器故障。  
可为任何容器设置以下任一 `ContainerDefinition` 属性。  
+ `MemoryHardLimitMebibytes`：为容器设置最大内存限制。如果容器超过此限制，则会重启。
+ `Vcpu` limit：保留最低数量的 vCPU 资源供容器专用。容器始终拥有该预留资源。如果有其他资源可用，其使用量可随时超过此最低限额。（1024 个 CPU 单位相当于 1 个 vCPU。）

**为容器组设置总资源限制**  
如果您为单个容器设置了限制，则可能需要修改容器组所需的内存和 vCPU 资源。目标是分配足够的资源来优化游戏服务器性能。Amazon GameLift Servers 使用这些限制来计算如何在实例集实例上打包游戏服务器容器组。此外，在为容器实例集选择实例类型时，也需要参考这些限制。  
计算容器组所需的总内存和 vCPU。请考虑以下事项：  
+ 容器组内所有容器运行的全部进程有哪些？ 将这些过程所需的资源累加起来。注意任何特定于容器的限制。
+ 您计划在每个容器组中运行多少个并发游戏服务器进程？ 您可以在游戏服务器容器映像中确定这一数量。
根据您对容器组需求的估计，设置以下 `ContainerGroupDefinition` 属性：  
+ `TotalMemoryLimitMebibytes`：为容器组设置最大内存限制。组中的所有容器共享分配的内存。如果已设置单个容器限制，则总内存限制必须等于或大于容器特定的最高内存限制。
+ `TotalVcpuLimit`：为容器组设置最大 vCPU 限制。组中的所有容器共享分配的 CPU 资源。如果已设置单个容器限制，则总 CPU 限制必须等于或大于所有容器特定 CPU 限制的总和。作为最佳实践，建议将此值设置为容器 CPU 限制之和的两倍。

**示例方案**  
假设我们要定义一个包含以下三个容器的游戏服务器容器组：  
+ 容器 A 为游戏服务器容器。一台游戏服务器的资源需求预估为 512 MiB 内存和 1024 个 CPU 单位。我们计划让容器运行 1 个服务器进程。由于此容器运行最关键的软件，我们没有设置内存限制或 vCPU 预留限制。
+ 容器 B 是一个支持容器，其资源需求估计为 1024 MiB 内存和 1536 个 CPU 单位。我们将内存限制设置为 2048 MiB，CPU 预留限制为 1024 个 CPU 单位。
+ 容器 C 是另一个支持容器。我们将硬性内存限制设置为 512 MiB，将 CPU 预留限制设置为 512 个 CPU 单位。
使用这些信息，我们为容器组设置了以下总限制：  
+ 总内存限制：7680 MiB。此值超过了最高内存限制（1024 MiB）。
+ CPU 总限制：13312 个 CPU 单位。此值超过了 CPU 限制的总和（1024\$1512 CPU）。

## 了解容器舰队的内存分配
<a name="containers-design-fleet-memory-allocation"></a>

在队列实例上Amazon GameLift Servers部署容器组时，并非该实例的所有内存都可用于您的容器。 Amazon GameLift Servers为操作系统、Amazon ECS 代理和其他支持服务保留一部分实例内存。预留内存量因实例类型的总内存而异。了解这一开销有助于您配置容器组定义以充分利用可用资源。

### 内存开销公式
<a name="containers-design-fleet-memory-formula"></a>

Amazon GameLift Servers使用以下步骤计算容器组的可用内存：

1. **确定内存缓冲区百分比。** Amazon GameLift Servers根据以下等级预留实例总内存的一定百分比：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/gameliftservers/latest/developerguide/containers-design-fleet.html)

1. **计算可用内存。**从实例总内存中减去预留内存：

   `AvailableMemory = InstanceMemory - round(InstanceMemory × BufferPercentage)`

1. **减去每个实例的容器组内存。**如果您的队列使用每个实例的容器组，请`TotalMemoryLimitMebibytes`从可用内存中减去该容器组。每个队列实例上运行一个每个实例的容器组。

   `AvailableMemory = AvailableMemory - PerInstanceCGD.TotalMemoryLimitMebibytes`

1. **考虑日志路由器开销。**如果队列启用了日志记录，则每个游戏服务器容器组为日志路由器额外Amazon GameLift Servers预留 50 MiB。

1. **计算最大游戏服务器容器组。**按内存容纳在实例上的游戏服务器容器组的最大数量为：

   `MaxGroupsByMemory = floor(AvailableMemory / (GameServerCGD.TotalMemoryLimitMebibytes + LogRouterMemory))`

   如果启用了日志记录，则`LogRouterMemory`为 50 MiB；如果禁用了日志记录，则为 0。

**注意**  
内存只是决定一个实例上可容纳多少个游戏服务器容器组的因素之一。 Amazon GameLift Servers还会考虑 vCPU 容量和可用连接端口，并使用所有三种计算中的最低值。

### 内存计算示例
<a name="containers-design-fleet-memory-example"></a>

假设队列使用启用了日志`c5.xlarge`记录的实例（总内存 8,192 MiB）：

1. 实例内存为 8,192 MiB，属于 5,000—9,999 层（缓冲区为 6%）

1. 预留内存 = 回合 (8,192 × 0.06) = 492 MiB

1. 可用内存 = 8,192-492 = 7,700 MiB

1. 如果使用的每实例容器组为 512：可用内存 = 7,700-512 = 7,188 MiB `TotalMemoryLimitMebibytes`

1. 如果每个游戏服务器容器组有 `TotalMemoryLimitMebibytes` 1,024 个： MaxGroupsByMemory = 下限 (7,188/(1,024 \$1 50)) = 下限 (7,188/1,074) = 6

### 按实例类型划分的可用内存
<a name="containers-design-fleet-memory-reference"></a>

下表显示了常用实例类型的总内存和可用内存（Amazon GameLift Servers缓冲区之后）。配置容器组定义时，请使用这些值作为起点。*可用内存*列显示实例上所有容器组的可用内存，然后再减去每个实例的容器组或日志路由器的开销。


| 实例类型 | 总内存 (MiB) | 缓冲区百分比 | 可用内存 (MiB) | 
| --- | --- | --- | --- | 
| c5.large | 4,096 | 8% | 3,768 | 
| c5.xlarge | 8192 | 6% | 7,700 | 
| c5.2xlarge | 16,384 | 5% | 15,565 | 
| c5.4xlarge | 32,768 | 5% | 31,130 | 
| c5.9xlarge | 73,728 | 5% | 70,042 | 
| c5.12xlarge | 98,304 | 4% | 94,372 | 
| c5.18xlarge | 147,456 | 4% | 141,558 | 
| c5.24xlarge | 196,608 | 4% | 188,744 | 
| m5.large | 8192 | 6% | 7,700 | 
| m5.xlarge | 16,384 | 5% | 15,565 | 
| m5.2xlarge | 32,768 | 5% | 31,130 | 
| m5.4xlarge | 65,536 | 5% | 62,259 | 
| m5.8xlarge | 131,072 | 4% | 125,829 | 
| m5.12xlarge | 196,608 | 4% | 188,744 | 
| r5.large | 16,384 | 5% | 15,565 | 
| r5.xlarge | 32,768 | 5% | 31,130 | 
| r5.2xlarge | 65,536 | 5% | 62,259 | 
| r5.4xlarge | 131,072 | 4% | 125,829 | 
| c6i.large | 4,096 | 8% | 3,768 | 
| c6i.xlarge | 8192 | 6% | 7,700 | 
| c6i.2xlarge | 16,384 | 5% | 15,565 | 
| c6i.4xlarge | 32,768 | 5% | 31,130 | 
| c6i.8xlarge | 65,536 | 5% | 62,259 | 
| c7i.large | 4,096 | 8% | 3,768 | 
| c7i.xlarge | 8192 | 6% | 7,700 | 
| c7i.2xlarge | 16,384 | 5% | 15,565 | 
| c7i.4xlarge | 32,768 | 5% | 31,130 | 
| c7i.8xlarge | 65,536 | 5% | 62,259 | 
| m7i.large | 8192 | 6% | 7,700 | 
| m7i.xlarge | 16,384 | 5% | 15,565 | 
| m7i.2xlarge | 32,768 | 5% | 31,130 | 
| m7i.4xlarge | 65,536 | 5% | 62,259 | 
| m7i.8xlarge | 131,072 | 4% | 125,829 | 
| m7i.12xlarge | 196,608 | 4% | 188,744 | 
| r7i.large | 16,384 | 5% | 15,565 | 
| r7i.xlarge | 32,768 | 5% | 31,130 | 
| r7i.2xlarge | 65,536 | 5% | 62,259 | 
| r7i.4xlarge | 131,072 | 4% | 125,829 | 

对于此处未列出的实例类型，您可以使用上述公式计算可用内存。查看 [Amazon EC2 实例类型文档](https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-instance-type-specifications.html)，了解所选实例类型的总内存。

## 配置 NVMe 云端硬盘访问权限
<a name="containers-design-fleet-nvme"></a>

在 d 型实例上， NVMe 驱动器会在主机启动期间自动装载到`/data`目录中。要使容器能够访问 SSD 存储，请设置以下`ContainerGroupDefinition`属性`MountPoints`：
+ `InstancePath`— 设置为`/data`以引用主机实例上自动装载的 NVMe 驱动器。
+ `AccessLevel`— 根据容器的需求选择适当的访问级别（例如 READ\$1ONLY 或 READ\$1WRITE）。
+ `ContainerPath`—（可选）指定将实例路径挂载到容器内的路径。如果未指定，则默认为实例路径。

有关挂载点的更多信息，请参阅 Amazon GameLift 服务器 API 参考[ContainerMountPoint](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_ContainerMountPoint.html)中的。

## 指定必备容器
<a name="containers-design-fleet-essential"></a>

对于每个实例容器组，需将每个容器指定为必备容器或非必备容器。每个实例容器组必须具有至少一个必备支持容器。必备容器负责容器组的关键工作，需始终保持运行状态。若其发生故障，整个容器组将重启。

将每个容器的 `ContainerDefinition` 属性 `Essential` 设置为 true 或 false。

## 配置网络连接
<a name="containers-custom-network"></a>

您可以自定义网络访问权限以允许外部流量连接到容器实例集中的任何容器。例如，您必须与运行游戏服务器进程的容器建立网络连接，以便游戏客户端能够接入并参与游戏。游戏客户端使用端口和 IP 地址连接到游戏服务器。

在容器实例集中，客户端与服务器之间并非直接连接。在内部，容器中的进程会监听*容器端口*。在外部，传入流量使用*连接端口*连接到实例集实例。Amazon GameLift Servers 维护内部容器端口和面向外部的连接端口之间的映射，以便将传入流量路由到实例上的正确进程。

Amazon GameLift Servers 为您的网络连接提供了额外一层控制。每个容器实例集都有*入站权限*设置，允许您控制对每个面向外部的连接端口的访问。例如，您可以移除所有连接端口的权限，以关闭对实例集容器的所有访问权限。

您可以更新实例集的入站权限、连接端口和容器端口。

**警告**  
如果您提供自定义 InstanceConnectionPortRange 或 InstanceInboundPermissions，则Amazon GameLift Servers将不再为您的队列管理任一值。您必须同时设置这两个字段，以避免出现未定义行为。

**设置容器端口范围**  
容器端口范围需作为每个容器定义的一部分进行配置。这是容器组定义的必填参数。您需要配置足够的端口，以容纳所有需要外部访问的并发运行的进程。有些容器不需要任何端口。  
运行游戏服务器的游戏服务器容器需要一个端口，用于每个并发运行的游戏服务器进程。游戏服务器进程会监听分配的端口并将其报告给 Amazon GameLift Servers。

**设置连接端口范围**  
为容器实例集配置一组连接端口。连接端口提供对运行容器的实例集实例的外部访问权限。Amazon GameLift Servers 会根据需要分配连接端口，并将其映射到容器端口。  
默认情况下，Amazon GameLift Servers 会计算所有容器组所需的端口数，并设置相应的端口范围以满足需求。我们强烈建议您使用 Amazon GameLift Servers 的计算值，该值会在您部署容器组定义更新时自动更新。如果您确实需要自定义连接端口范围，请使用以下指南。  
创建容器队列时，请定义连接端口范围（请参阅[ ContainerFleet:InstanceConnectionPortRange](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_ContainerFleet.html)）。确保该范围有足够的端口，可以映射到在实例集中两个容器组内所有容器中定义的每个容器端口。要计算所需的最小连接端口数，请使用以下公式：  
`[Total number of container ports defined for containers in the game server container group] * [Number of game server container groups per instance] + [Total number of container ports defined for containers in the per-instance container group]`  
最佳实践是，将最小连接端口数量翻倍。  
连接端口的数量可能会限制每个实例的游戏服务器容器组的数量。如果实例集的连接端口仅足以满足每个实例部署一个游戏服务器容器组的需求，则即使实例的计算资源足以承载多个游戏服务器容器组，Amazon GameLift Servers 仍只会部署一个游戏服务器容器组。

**设置入站权限**  
入站权限通过指定允许传入流量访问的连接端口，来控制对容器实例集的外部访问。您可以使用此设置，根据需要开启和关闭实例集的网络访问权限。  
默认情况下，Amazon GameLift Servers 会计算所有容器组所需的端口数，并设置相应的端口范围以满足需求。我们强烈建议您使用 Amazon GameLift Servers 的计算值，该值会在您部署容器组定义更新时自动更新。如果您确实需要自定义连接端口范围，请使用以下指南。  
创建容器队列时，请定义一组入站权限（请参阅[ ContainerFleet:InstanceInboundPermissions](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_ContainerFleet.html)）。入站许可端口应与实例集的连接端口范围相匹配。  
由于容器端口是从中随机选择的 InstanceConnectionPortRange，因此为了保证可以建立会话连接，因此中的所有端口都 InstanceConnectionPortRange 应被中的端口覆盖 InstanceInboundPermissions

**示例方案**  
此示例说明了如何设置所有三个网络连接属性。  
+ 我们实例集的游戏服务器容器组有 1 个容器，其中运行 1 个游戏服务器进程。

  在游戏服务器容器组定义中，我们按如下方式设置该容器的 `PortConfiguration` 参数：

  ```
  "PortConfiguration": {
    "ContainerPortRanges": [ { "FromPort": 10, "ToPort": 20, "Protocol": "TCP"} ]  }
  ```
+ 我们的实例集还有一个每个实例容器组，其中包含 1 个容器。它有 1 个需要网络访问的进程。在每个实例的容器定义中，我们按如下方式设置此容器的 `PortConfiguration` 参数：

  ```
  "PortConfiguration": {
    "ContainerPortRanges": [ { "FromPort": 25, "ToPort": 25, "Protocol": "TCP"} ]  }
  ```
+ 我们的实例集为每个实例集实例配置 20 个游戏服务器容器组。有了这些信息，我们可以使用以下公式来计算需要的连接端口数：
  + 最少：**21 个端口** [1 个游戏服务器容器端口 \$1 每个实例 20 个游戏服务器容器组 \$1 1 个每个实例容器端口]
  + 最佳实践：**42 个端口** [最少端口 \$1 2]

  在创建容器实例集时，我们按如下方式设置 `InstanceConnectionPortRange` 参数：

  ```
  "InstanceConnectionPortRange": { "FromPort": 1010, "ToPort": 1071 }
  ```
+ 我们希望允许访问所有可用的连接端口。在创建容器实例集时，我们按如下方式设置 `InstanceInboundPermissions` 参数：

  ```
  "InstanceInboundPermissions": [ 
    {"FromPort": 1010, "ToPort": 1071, "IpRange": "10.24.34.0/23", "Protocol": "TCP"} ]
  ```

## 为容器设置运行状况检查
<a name="containers-design-fleet-health"></a>

如果容器遇到终端故障并停止运行，它会自动重启。如果容器标记为必备容器，它会提示整个容器组重新启动。

所有游戏服务器容器都自动被视为是必备容器。可以将支持容器指定为必备容器，但它们需要有报告运行状况的机制。您也可以为非必备支持容器设置运行状况检查。

您可以定义其他自定义标准来衡量容器运行状况，并使用运行状况检查来测试该标准。要设置容器运行状况检查，可以在 Docker 容器映像或容器定义中对其进行定义。如果您在容器定义中设置了运行状况检查，它将覆盖容器映像中的所有设置。

为容器运行状况检查设置以下 `SupportContainerDefinition` 属性：
+ `Command`：提供一个命令来检查容器运行状况的某些方面。您可以决定使用什么标准来衡量运行状况。该命令的退出值必须为 1（不正常）或 0（正常）。
+ `StartPeriod`：指定在开始统计运行状况检查失败次数前的初始延迟时间。此延迟为容器提供启动内部进程的时间。
+ `Interval`：决定执行运行状况检查命令的频率。您希望以多快的速度检测和解决容器故障？
+ `Timeout`：决定在重试运行状况检查命令之前等待成功或失败的时间。运行状况检查命令需要多长时间才能完成？
+ `Retries`：在判定为失败前，运行状况检查命令应重试多少次？

## 设置容器依赖关系
<a name="containers-design-fleet-dependencies"></a>

在每个容器组中，您可以根据容器状态设置容器之间的依赖关系。依赖关系会根据另一容器的状态，影响依赖容器的启动或关闭时机。

依赖关系的一个关键使用案例是为容器组创建启动和关闭序列。

例如，您可能希望容器 A 先启动并成功完成，然后再启动容器 B 和 C。要实现这一点，首先要在容器 A 上为容器 B 创建一个依赖关系，条件是容器 A 必须成功完成。然后在容器 A 上为容器 C 创建具有相同条件的依赖关系。启动顺序与关机顺序相反。

## 配置容器实例集
<a name="containers-design-fleet-config"></a>

在创建容器实例集时，请考虑以下决策点。这些要点大多取决于容器架构和配置。

**确定要部署实例集的位置**  
通常，您应将实例集部署在靠近玩家的地理位置，以最大限度地减少延迟。您可以将您的集装箱舰队部署到任何 AWS 区域 Amazon GameLift Servers支持的集装箱舰队。如果您想将同一台游戏服务器部署到其他地理位置，则可以将远程位置添加到队列中，包括 AWS 区域 和 Local Zones。对于多位置实例集，您可以单独调整每个实例集位置的容量。有关支持的实例集位置的更多信息，请参阅[Amazon GameLift Servers 服务位置](gamelift-regions.md)。  
建议使用 [UDP ping 信标](reference-udp-ping-beacons.md)来收集不同地理位置的网络延迟数据，以预测玩家设备和潜在实例集位置之间的延迟。这些特殊端点接受 UDP 消息，而不是传统的 ICMP ping 消息，同时提供准确的延迟测量，有助于您选择最佳实例集位置。

**为实例集选择实例类型和规格**  
Amazon GameLift Servers 支持多种 Amazon EC2 实例类型，所有这些类型都可用于容器实例集。实例类型的可用性和价格因位置而异。您可以在 Amazon GameLift Servers 控制台（在**“资源”、“实例”和“服务配额**”下）中查看按位置筛选的支持实例类型列表。  
选择实例类型时，首先要考虑实例系列。不同实例系列提供不同的 CPU、内存、存储和网络功能组合。了解有关 [EC2 实例系列](https://aws.amazon.com/ec2/instance-types/)的更多信息。每个实例系列下均提供多种实例规格供您选择。选择实例规格时，需考虑以下问题：  
+ 支持您的工作负载所需的最小实例规格是什么？ 利用该信息排除所有规格过小的实例类型。
+ 哪些实例规格适合您的容器架构？ 理想情况下，应选择能够容纳多个游戏服务器容器组副本且资源浪费最少的规格。
+ 哪种扩缩粒度适合您的游戏？ 扩缩实例集容量涉及添加或删除实例，每个实例都代表托管特定数量的游戏会话的能力。需考虑每次添加或移除实例时希望调整的容量大小。如果玩家需求每分钟波动有数千之多，则使用可承载数百或数千个游戏会话的超大型实例可能更为合理；相反，若需要更精细的扩缩控制，则可选择小型实例类型。
+ 是否可通过规格选择节省成本？ 部分实例类型的价格可能因地区可用性不同而存在差异，您可据此寻找成本优化空间。

**设置其他可选实例集设置**  
在配置容器实例集时，可以使用以下可选功能：  
+ 设置游戏服务器以访问其他 AWS 资源。请参阅[将您的Amazon GameLift Servers托管游戏服务器连接到其他 AWS 资源](gamelift-sdk-server-resources.md)。
+ 保护存在活跃玩家的游戏会话，防止在缩减事件期间过早终止。
+ 限制单个玩家在有限的时间范围内可在实例集上创建的游戏会话数。

# 借助竞价型实例集降低游戏托管成本
<a name="fleets-spot"></a>

使用 Amazon GameLift Servers 托管式托管服务托管多人游戏服务器时，竞价型实例可作为按需型实例的高性价比替代方案。竞价定价模式提供与按需型定价模式相同的硬件配置和性能表现，但可节省大量成本（高达 70-90%）。但是，它们有一个限制：当 AWS 需要恢复容量时，它可以通过两分钟的中断通知回收这些实例。

Amazon GameLift Servers 降低了游戏服务器托管中断的风险。Amazon GameLift Servers 会预测各类竞价型实例的中断概率，避免在高风险实例上部署游戏会话。如果发生罕见的中断情况，您可借助中断通知为玩家平稳结束当前游戏会话。

## Amazon GameLift Servers 如何与竞价型实例集协同工作
<a name="spot-fleet-howitworks"></a>

为游戏托管设置竞价型实例集后，Amazon GameLift Servers 会持续评估竞价型实例集中实例类型和位置，以确定游戏托管的可行性。
+ 竞价型实例可行性算法会按位置分析竞价型实例类型的近期可用性模式和历史中断率。
+ 根据此分析，Amazon GameLift Servers 会识别出游戏会话中断风险不可接受的竞价型实例类型和位置。它将执行以下操作：
  + 将该实例类型和位置的组合标记为暂时不可行。
  + 新增游戏会话时不再考虑这些不可行的竞价型实例集位置，确保游戏会话仅部署在中断风险低、托管稳定性高的竞价型实例集位置。
  + 即使 AWS 未主动回收资源，也会逐步下线该竞价型实例集位置的既有实例，避免为无法用于游戏托管的实例付费。如果开启游戏会话保护，实例仅在当前活跃游戏会话结束后才会关闭。
+ Amazon GameLift Servers 会持续重新评估您的竞价型实例集中实例类型和位置，以确定游戏托管的可行性。当历史数据更新显示某类曾不可行的实例类型恢复可行时，您可重新纵向扩展该竞价型实例集，Amazon GameLift Servers 也会恢复在该类型实例上部署游戏会话。

## 设计注意事项
<a name="spot-fleet-design"></a>

在设计使用竞价型实例集的解决方案时，需考量以下问题：
+ **评估游戏会话时长**：游戏会话的平均时长会影响竞价型实例在游戏中的表现情况。游戏会话时长较短时，快速周转机制可确保游戏会话始终运行在基于最新历史数据判定的可行实例类型上。而时长较长的游戏会话会持续运行在初始实例类型上，不再评估近期可行性数据，随着时间推移面临更高的中断风险。
+ **评估实例类型可用性**：并非所有实例集位置都提供全类型的竞价型实例。为竞价型实例集选择实例类型时，可使用 Amazon GameLift Servers 控制台实例集创建工具来帮助您在所需位置找到竞价型实例类型。使用此工具，您可以选择实例集位置，然后查看这些位置的实例类型可用性。
+ **创建多位置竞价型实例集**：您可以创建具有多个位置的竞价型实例集。单个多地点 Spot 队列将具有相同实例类型的实例部署到多个 AWS 区域 或 Local Zones。竞价型实例可行性算法根据实例类型和位置综合评估可行性。如果某个竞价型实例集位置被评估为不可行，则它不会影响实例集中的其他位置，这些位置仍可正常托管游戏会话。
+ **创建具有竞价型实例集多样性的队列**：如果您使用竞价型实例集托管游戏，则需设置游戏会话放置队列。队列会针对每个新游戏会话请求查找可用游戏托管资源并选择最优方案。针对竞价型实例集，建议队列支持跨多个实例集搜索（覆盖不同位置和实例类型），且至少包含一个按需型实例集作为备份容量。设计完善的多实例集队列可提供多样化放置选项，能有效抵御中断、性能下降及服务中断等风险。有关为竞价型实例设计队列的更多指导，请参阅[为竞价型实例构建队列](spot-tasks.md)。
+ **平移处理中断**：设置游戏服务器，以最大限度地降低竞价型实例中断对玩家的影响。 AWS 回收竞价型实例时，使用服务器 SDK 回调函数`onProcessTerminate()`将终止通知Amazon GameLift Servers传递给所有受影响的服务器进程。游戏需实现该回调函数，以平稳结束游戏会话。有关更多信息，请参阅 [回应服务器进程关闭通知](gamelift-sdk-server-api.md#gamelift-sdk-server-terminate)。
**注意**  
AWS 会尽一切努力在回收实例之前提供通知，但有可能在警告到来之前 AWS 收回竞价型实例。您还需配置游戏服务器以应对突发中断情况。
+ **为备份实例集配置自动扩缩，保障竞价型实例中断期间的服务连续性。**目标跟踪型自动扩缩可保持容量缓冲并根据需求自动扩展。借助自动扩缩，备份实例集（竞价型或按需型）会在收到的游戏会话请求量增加时，自动开始提升容量。

  当竞价型实例集判定为不可行时，可借助自定义扩展机制，利用队列及实例集的可用指标触发备份实例集的快速横向扩展，以迅速补充丢失的容量。可通过 `FirstChoiceOutOfCapacity`、`FirstChoiceNotViable` 和 `PercentAvailableGameSessions` 等指标检测竞价型实例集的不可行状态。通过分析近期 `PlacementsStarted` 指标数据预估替换容量需求。待备份实例集扩展至满足即时需求后，即可切换回常规自动扩缩模式。
+ **与 FlexMatch 集成**：如果您的解决方案使用 FlexMatch 对战构建器，则对竞价型实例集无特殊要求。您可将对战构建器配置为使用含竞价型实例集的队列。Amazon GameLift Servers 会自动优先处理竞价型实例集和按需型实例集间的对战部署，包括新游戏会话部署及现有游戏会话中空玩家位置的回填操作。

# 在托管式 Amazon GameLift Servers 上优化游戏服务器运行时配置
<a name="fleets-multiprocess"></a>

您可以设置托管 EC2 实例集的运行时配置，以便对每个实例运行多个游戏服务器进程。这样可以更有效地使用您的托管资源。

## 实例集如何管理多个进程
<a name="fleets-multiprocess-howitworks"></a>

Amazon GameLift Servers 使用实例集的运行时配置来确定要在每个实例上运行的进程的类型和数量。运行时配置至少包含一个代表一个游戏服务器可执行文件的服务器进程配置。您可以定义其他服务器进程配置，以运行与您的游戏相关的其他类型的进程。每个服务器进程配置都包含以下信息：
+ 游戏构建中可执行文件的文件名和路径。
+ （可选）要在启动时传递给进程的参数。
+ 要同时运行的进程的数量。

当实例集中的实例激活时，它会启动在运行时配置中定义的服务器进程。对于多个进程，Amazon GameLift Servers 会错开每个进程的启动。服务器进程具有有限的生命周期。当它们结束时，Amazon GameLift Servers 会启动新的进程，以保持运行时配置中定义的服务器进程的数量和类型。

您可以随时通过添加、更改或删除服务器进程配置来更改运行时配置。每个实例都会定期检查对实例集运行时配置的更新，以实施更改。以下介绍 Amazon GameLift Servers 如何采纳运行时配置更改：

1. 该实例向 Amazon GameLift Servers 发送请求以获取最新版本的运行时配置。

1. 该实例将其活动进程与最新的运行时配置进行比较，然后执行以下操作：
   + 如果更新的运行时配置删除了某个服务器进程类型，此类型的活动服务器进程将继续运行直到结束。该实例不会取代这些服务器进程。
   + 如果更新的运行时配置减少了某个服务器进程类型的并发进程数，此类型的多余服务器进程将继续运行直到结束。该实例不会取代这些多余服务器进程。
   + 如果更新的运行时配置添加了新的服务器进程类型或增加了现有类型的并发进程，该实例将启动新的服务器进程，直至达到 Amazon GameLift Servers 的上限。在这种情况下，该实例在现有进程结束时启动新的服务器进程。

## 针对多个进程优化实例集
<a name="fleets-multiprocess-changes"></a>

要在实例集上使用多个进程，请执行以下操作：
+ [创建生成包](gamelift-build-intro.md)，其中包含您要部署到实例集的游戏服务器可执行文件，然后将生成包上传到 Amazon GameLift Servers。生成包中的所有游戏服务器都必须在同一个平台上运行并使用 Amazon GameLift Servers 的服务器软件开发工具包。
+ 使用一个或多个服务器进程配置和多个并发进程创建运行时配置。
+ 将游戏客户端与 AWS SDK 版本 2016-08-04 或更高版本集成。

要优化实例集性能，建议您执行以下操作：
+ 处理服务器进程关闭方案，以确保 Amazon GameLift Servers 可以高效率地回收进程。例如：
  + 向调用服务器 API `ProcessEnding()` 的游戏服务器代码添加关闭程序。
  + 在您的游戏服务器代码中实现回调函数 `OnProcessTerminate()` 以处理来自 Amazon GameLift Servers 的终止请求。
+ 确保 Amazon GameLift Servers 已关闭并重新启动运行状况不正常的服务器进程。您可以通过在游戏服务器代码中实现 `OnHealthCheck()` 回调函数来将该运行状况回报给 Amazon GameLift Servers。Amazon GameLift Servers 自动关闭连续三次均报告为运行状况不正常的服务器进程。如果不实现 `OnHealthCheck()`，Amazon GameLift Servers 会假定服务器进程正常运行，除非该进程无法响应通信。

## 选择每个实例的进程数
<a name="fleets-multiprocess-number"></a>

在决定要在实例上运行的并发进程数时，需要记住以下内容：
+ Amazon GameLift Servers 限制每个实例的[最大并发进程数](https://docs.aws.amazon.com/general/latest/gr/gamelift.html#limits_gamelift)。实例集服务器进程配置的所有并发进程的总和不能超过此限额。
+ 为维持可接受的性能水平，Amazon EC2 实例类型可能会限制可并发运行的进程数。测试游戏的不同配置以找出您首选实例类型的合适进程数。
+ Amazon GameLift Servers 运行的并发进程数不会超过配置的总数。这意味着从以前的运行时配置到新配置的过渡可能会逐渐发生。

# 使用 Amazon GameLift Servers 代理
<a name="integration-dev-iteration-agent"></a>

 Amazon GameLift Servers 代理负责监督 Amazon GameLift Servers 实例集上游戏服务器进程的运行。该代理被部署到实例集中的每个计算上，为计算提供自动化进程管理、托管管理和日志记录。要使用该代理，必须将游戏服务器生成包与 Amazon GameLift Servers 服务器 SDK 5.x 或更高版本集成。

Amazon GameLift Servers 代理可从外部提供给不是托管式 EC2 实例集的 Amazon GameLift Servers 实例集使用。（托管式 EC2 实例集会自动处理该代理的任务。） 您可以选择在有或没有该代理的情况下运行 Amazon GameLift Servers 实例集，包括 Anywhere 实例集。如果没有该代理，您必须提供完成所需任务的替代解决方案。

部署到计算时，应在启动任何游戏服务器进程之前启动 Amazon GameLift Servers 代理。启动时，该代理将完成以下任务：
+ 使用 [RegisterCompute](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_RegisterCompute.html) API 将该计算资源注册到 Amazon GameLift Servers Anywhere 实例集。
+ 调用 [GetComputeAuthToken](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_GetComputeAuthToken.html) API 以获取授权令牌，并将其存储起来供在计算上运行的服务器进程使用。
+ 为计算设置 WebSocket URL 环境变量，并与 Amazon GameLift Servers 服务建立 WebSocket 连接。
+ 从 Amazon GameLift Servers 服务请求最新版本的实例集的运行时配置。
+ 根据运行时配置说明启动和停止服务器进程。

Amazon GameLift Servers 代理的源代码和生成包说明可在 [Amazon GameLift Servers 代理](https://github.com/aws/amazon-gamelift-agent) GitHub 上找到。

## 关于该代理
<a name="gamelift-agent-usage"></a>

Amazon GameLift Servers 代理专为您的实例集处理以下任务：

**进程管理**
+ 启动运行时指令中定义的新服务器进程。该代理可能使用与其一起部署的自定义运行时配置。或者，您也可以提供 `RuntimeConfiguration` 作为实例集定义的一部分。此方法的优势在于，您可以随时修改实例集的运行时配置。该代理会定期从 Amazon GameLift Servers 服务请求更新的运行时配置。
+ 监控服务器进程的激活情况，并在进程未及时激活时将其终止。
+ 向 Amazon GameLift Servers 发送心跳。如果该代理未发送心跳，计算可能会被标记为过时。
+ 在服务器进程终止时，向 Amazon GameLift Servers 报告。Amazon GameLift Servers 会使用此信息监控游戏服务器可用性，以便进行游戏会话放置。
+ 为服务器进程发出实例集事件，包括：
  + `SERVER_PROCESS_INVALID_PATH`：游戏服务器进程启动参数配置不正确。
  + `SERVER_PROCESS_TERMINATED_UNHEALTHY`：游戏服务器进程在激活后 3 分钟内未报告有效的运行状况检查，因此被终止。
  + `SERVER_PROCESS_FORCE_TERMINATED`：游戏服务器进程在发送 `OnProcessTerminate()` 后 30 秒内未完全退出。
  + `SERVER_PROCESS_CRASHED`：游戏服务器进程因某种原因而崩溃。

**计算管理**
+ 接收 Amazon GameLift Servers 服务发出的消息以关闭计算。
+ 提示由 Amazon GameLift Servers 终止计算。

**日志记录**
+ 将日志上传到 AWS 账户中的 Amazon S3 存储桶。

# 使用别名抽象化 Amazon GameLift Servers 实例集名称
<a name="aliases-intro"></a>

Amazon GameLift Servers *别名*用于抽象化托管目标。托管目标告知 Amazon GameLift Servers 为玩家托管新游戏会话时可从中查找可用资源的位置。别名在以下情况下很有用：
+ 如果您的游戏不使用多舰队队列来放置游戏会话，则它会通过指定Amazon GameLift Servers舰队 ID 来请求新的游戏会话。在一个游戏的生命周期内，您会多次更换实例集，以更新服务器生成包、更新托管硬件和操作系统或者解决性能问题。使用别名来抽象化实例集 ID，以便将玩家流量从现有实例集无缝切换到新实例集。
+ 除了在游戏客户端请求创建新游戏会话时创建该会话之外，您还想执行其他操作。例如，你可能想将使用 out-of-date客户端的玩家引导到升级网站。

别名必须指定路由策略。该策略有两种类型。*简单*路由策略会将玩家流量路由到指定的实例集 ID，您可以更新该 ID 以重定向流量。*终端*路由策略会将消息传回客户端，而不是创建新游戏会话。您可以随时更改别名的路由策略。

如果您使用队列进行游戏会话放置，那么您在替换实例集时不需要别名来重定向流量。有了队列，您只需添加新实例集并删除旧实例集即可。此操作对玩家不可见，因为系统会自动使用新实例集来执行新游戏会话请求。它不会影响现有游戏会话。您可以使用实例集 ID 或别名来识别队列目标。



**Topics**
+ [创建 Amazon GameLift Servers别名](aliases-creating.md)

# 创建 Amazon GameLift Servers别名
<a name="aliases-creating"></a>

本主题介绍如何创建用于游戏会话放置的 Amazon GameLift Servers 别名。

**创建别名**

使用 Amazon GameLift Servers 控制台或 AWS Command Line Interface（AWS CLI）创建别名。

------
#### [ Console ]

在 [Amazon GameLift Servers 控制台](https://console.aws.amazon.com/gamelift/)中，使用导航窗格打开**别名**页面。

1.  选择**创建别名**。

1. 输入别名**名称**。我们建议在别名名称中包含有意义的特征，以便在查看别名列表时提供帮助。

1. 根据需要输入别名**描述**。

1. 为别名选择**路由策略**。

   1. 如果您选择了**简单**路由策略，请从列表中选择要与此别名关联的实例集 ID。该列表包含当前选择的 AWS 区域中的所有实例集。您必须在实例集所在的区域中创建别名。

   1. 如果您选择了**终端**路由策略，请输入一个您希望 Amazon GameLift Servers 在响应游戏会话请求时返回给游戏客户端的字符串值。带有终端别名的请求会引发嵌入的消息的异常。

1. （可选）向别名资源添加**标签**。每个标签都包含定义的一个键和一个可选值。为您希望以有用的方式（如按用途、所有者或环境）分类的 AWS 资源分配标签。为每个要添加的标签选择**添加新标签**。

1. 当您准备好部署新实例集时，请选择**创建**。

------
#### [ AWS CLI ]

使用 [https://docs.aws.amazon.com/cli/latest/reference/gamelift/create-alias.html](https://docs.aws.amazon.com/cli/latest/reference/gamelift/create-alias.html) 命令创建别名。Amazon GameLift Servers 会在当前的默认 AWS 区域中创建别名资源（您也可以添加 --region 标签来指定其他 AWS 区域）。

至少要包含别名名称和路由策略。对于简单路由策略，请指定与别名位于同一区域的实例集的 ID。对于终端路由策略，请提供消息字符串。

------