

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定遊戲工作階段置放
<a name="queues-intro"></a>

遊戲工作階段置放是尋找可用遊戲伺服器以託管新遊戲工作階段的程序。 Amazon GameLift Servers會使用遊戲工作階段佇列，以智慧方式將遊戲工作階段置放在機群中，並考量玩家延遲、機群容量和成本最佳化等因素。

設定良好的遊戲工作階段佇列可確保玩家連線到最佳的可用遊戲伺服器，提供最佳效能，同時有效率地使用您的託管資源。佇列可以跨越多個機群和 AWS 區域，以提供全域涵蓋範圍和備援。

遊戲工作階段佇列是Amazon GameLift Servers使用 搜尋可用遊戲伺服器並選擇它們來託管新遊戲工作階段的主要機制。佇列提供更有效率的方式來處理大量遊戲工作階段請求，並在多個託管資源機群中尋找這些請求的位置。如果您的託管解決方案使用多個機群，而且您正在處理大量請求，您可能需要佇列。

當您的遊戲想要為玩家啟動新的遊戲工作階段時，它會傳送置放請求給 Amazon GameLift Servers服務，該服務會將它排入佇列。佇列的組態決定處理請求的時間和方式。處理置放請求時， Amazon GameLift Servers會搜尋一組機群，讓遊戲伺服器託管遊戲工作階段。當 Amazon GameLift Servers找到可用的遊戲伺服器並提示其啟動遊戲工作階段時，配置會成功。

**Topics**
+ [佇列特性](#queues-intro-characteristics)
+ [Amazon GameLift Servers 遊戲工作階段佇列的最佳實務](#queues-best-practices)
+ [建立遊戲工作階段佇列](queues-creating.md)
+ [設定遊戲工作階段放置的事件通知](queue-notification.md)

## 佇列特性
<a name="queues-intro-characteristics"></a>

Amazon GameLift Servers 遊戲工作階段佇列是 AWS 雲端資源。您可以在任何 AWS 區域 Amazon GameLift Servers 支援的 中建立佇列 （請參閱 [Amazon GameLift Servers 服務位置](gamelift-regions.md))。遊戲工作階段置放請求會傳送到該位置，並在該位置進行處理。

使用佇列自動化遊戲工作階段放置，可為遊戲開發人員和玩家提供顯著的好處。其中包含：
+ **佇列提供「最佳可能」放置。**處理遊戲工作階段置放請求時，佇列會使用 Amazon GameLift Servers FleetIQ 演算法，根據一組定義的偏好設定來排定置放的優先順序，包括成本、位置和玩家延遲。
+ **佇列支援 Spot 機群，以協助降低遊戲託管成本。**您可以使用 AWS Spot 機群設定佇列，這通常會大幅降低託管成本，以及隨需機群。由於低成本是置放的關鍵條件之一，因此佇列永遠可以利用成本差異。
+ **佇列可以在高需求期間更快地放置新遊戲。**透過設定具有多個機群的佇列，您可以為遊戲工作階段放置提供更靈活的選項。但是，當需求增加時，其他機群也會視需要提供備份容量。對於任何置放請求，如果 Amazon GameLift Servers 無法將遊戲工作階段放置在最偏好的位置，它會自動繼續評估其他位置。
+ **佇列可讓遊戲伺服器可用性更具彈性。**可能會發生中斷。使用多機群佇列時，慢速或中斷並不會影響玩家存取您的遊戲。透過使用在不同 AWS 區域 和可用區域中具有容量的機群來設定佇列，您可以協助確保玩家總是可以找到要加入的遊戲工作階段。
+ **取得遊戲工作階段置放和佇列效能的指標。** Amazon GameLift Servers 會發出佇列指標，包括置放成功和失敗的統計資料、佇列中的請求數量，以及請求在佇列中花費的平均時間。您可以在 Amazon GameLift Servers主控台或 CloudWatch 中檢視這些指標。

若要開始建立基本入門佇列，請參閱 [建立遊戲工作階段佇列](queues-creating.md)。

**Topics**
+ [佇列特性](#queues-intro-characteristics)
+ [Amazon GameLift Servers 遊戲工作階段佇列的最佳實務](#queues-best-practices)
+ [建立遊戲工作階段佇列](queues-creating.md)
+ [設定遊戲工作階段放置的事件通知](queue-notification.md)

## Amazon GameLift Servers 遊戲工作階段佇列的最佳實務
<a name="queues-best-practices"></a>

遊戲工作階段佇列包含Amazon GameLift Servers可以放置新遊戲工作階段的機群清單。每個機群都可以在多個地理位置部署託管資源。選擇置放時，佇列會根據您為機群設定的一組優先順序，選取機群和機群位置。

請考慮下列準則和最佳實務：
+ **在涵蓋玩家的位置新增機群。**您可以在任何可用位置新增機群和別名。如果您根據報告的玩家延遲進行放置，位置很重要。
+ **對所有機群使用別名。**將別名指派給佇列中的每個機群，並在設定佇列中的目的地時使用別名名稱。
+ **對所有機群使用相同或類似的遊戲組建或指令碼。**佇列可能會將玩家放入佇列中任何機群的遊戲工作階段。玩家必須能夠在任何機群的任何遊戲工作階段中玩遊戲。
+ **在至少兩個位置建立機群。**透過在至少一個其他位置託管遊戲伺服器，您可以減輕區域中斷對玩家的影響。您可以縮減備份機群的規模，並在用量增加時使用自動擴展來增加容量。
+ **排定遊戲工作階段放置的優先順序。**佇列會根據數個元素排定置放選擇的優先順序，包括目的地清單順序。
+ **在與用戶端服務相同的位置建立佇列。**透過將佇列放在用戶端服務附近的位置，您可以將通訊延遲降至最低。
+ **使用具有多個位置的機群。**使用佇列篩選條件組態，以防止佇列將遊戲工作階段放置在指定位置。您可以使用至少兩個具有不同主位置的多位置機群，以減輕區域中斷期間遊戲置放的影響。
+ **對所有機群使用相同的 TLS 憑證設定。**連線至機群中遊戲工作階段的遊戲用戶端必須具有相容的通訊協定。

# 建立遊戲工作階段佇列
<a name="queues-creating"></a>

佇列用於跨多個機群和位置放置新的遊戲工作階段。您的遊戲會透過向佇列提交放置請求來啟動新的遊戲工作階段。佇列已設定有關如何處理請求的指示。進一步了解如何在 中啟動遊戲工作階段置放請求[建立遊戲工作階段](gamelift-sdk-client-api.md#gamelift-sdk-client-api-create)。

**建立遊戲工作階段佇列**

這些指示說明如何以最少的組態設定和預設設定建立簡單的工作佇列。有多種選項可自訂佇列組態。這些選項可協助您根據遊戲的需求進行最佳的配置。若要進一步了解如何自訂遊戲的佇列，請參閱 [自訂遊戲工作階段佇列](queues-design.md)。您可以隨時更新大多數佇列組態設定。

您可以使用Amazon GameLift Servers主控台或 AWS CLI 建立遊戲工作階段佇列。

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

在 [Amazon GameLift Servers主控台](https://console.aws.amazon.com/gamelift/)中，選取要使用的 AWS 區域。開啟主控台的左側導覽列，然後選擇**佇列**。

1. 在**佇列**頁面上，選擇**建立佇列**以啟動工作流程。

1. 在**佇列設定**下，輸入下列設定：

   1. 輸入佇列名稱。此名稱對於您要建立佇列 AWS 區域 的 必須是唯一的。

   1. 保留預設**逾時**設定，即 600 秒 （或 10 分鐘）。此值控制Amazon GameLift Servers在停止之前嘗試放置新遊戲工作階段的時間長度。 Amazon GameLift Servers會搜尋可用的資源，直到請求逾時為止。您可以隨時更新佇列的逾時設定。

   1. 略過**玩家延遲政策**區段。佇列只會在接收包含玩家延遲資料的置放請求時使用延遲政策。您可以隨時將延遲政策新增至佇列。如需建立延遲政策的詳細資訊，請參閱 [建立玩家延遲政策](queues-design-latency.md)。

1. 略過**遊戲工作階段置放位置**區段，以使用**所有位置**的預設設定。此設定可讓您建立允許清單，列出佇列可以進行置放的位置 （也稱為篩選條件組態）。如需依位置和篩選條件組態排定優先順序的詳細資訊，請參閱 [依位置排定置放的優先順序](queues-design-priority.md#queues-design-priority-custom-location)。

1. 在**目的地順序**下，將一或多個機群新增至佇列。您可以使用機群 IDs 或 ARNs，或使用機群別名來識別機群。新增多個機群時，請記住它們都應該執行類似的遊戲組建，並與使用此佇列的任何遊戲用戶端相容。此外，佇列中的所有機群都必須具有相同的憑證組態。

   1. 選取建立機群或別名**的區域**。對於多位置機群，這是「首頁」區域。

   1. 針對目的地**類型**，選取機群或別名。

   1. 您的區域和類型選擇會填入現有機群或別名的下拉式清單。選擇一個 以指定為佇列目的地。

   1. 若要為佇列指定其他機群或別名，請選擇**新增目的地**並重複上述步驟。

   1. 新增目的地清單後，請使用drag-and-drop功能來重新排序目的地。 會在依目的地排定置放的優先順序時Amazon GameLift Servers使用此順序。

1. 略過**遊戲工作階段置放優先順序**區段，以保留預設優先順序。此設定可讓您自訂 如何Amazon GameLift Servers選擇尋找新遊戲工作階段置放可用託管資源的位置。如需排定置放優先順序的詳細資訊，請參閱 [排定遊戲工作階段放置的優先順序](queues-design-priority.md)。您可以隨時更新佇列的置放優先順序。

1. 在**位置順序**下，保留預設值。依機群位置排定優先順序時，會使用此設定。它提供要使用的位置順序。使用預設優先順序設定時，當偏好的目的地是具有多個位置的機群時，位置會用作繫結器。

1. 略過選用**的事件通知設定**區段。處理大量置放請求的佇列需要事件通知。對於處理低磁碟區的佇列，例如用於開發或測試目的，您可以透過輪詢 [DescribeGameSessionPlacement](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_DescribeGameSessionPlacement.html) 來追蹤置放請求的狀態。如需詳細資訊，請參閱[設定遊戲工作階段放置的事件通知](queue-notification.md)。您可以隨時更新佇列的事件通知設定。

1. 選擇**建立**以產生最少自訂的新佇列。

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

**Example 建立佇列**  
下列範例會建立具有這些組態的遊戲工作階段佇列：  
+ 五分鐘逾時。
+ 兩個機群目的地。
+ 篩選以僅允許置放在這些位置：`us-east-1`、`us-east-2`. `us-west-2`和 `ca-central-1`。
+ 根據成本和指定順序中位置的優先順序。

```
aws gamelift create-game-session-queue \
    --name "sample-test-queue" \
    --timeout-in-seconds 300 \
    --destinations DestinationArn="arn:aws:gamelift:us-east-1:111122223333:fleet/fleet-772266ba-8c82-4a6e-b620-a74a62a93ff8" DestinationArn="arn:aws:gamelift:us-east-1:111122223333:fleet/fleet-33f28fb6-aa8b-4867-85b4-ceb217bf5994" \
    --filter-configuration "AllowedLocations=us-east-1, ca-central-1, us-east-2, us-west-2" \
    --priority-configuration PriorityOrder="COST","LOCATION",LocationOrder="us-east-1","us-east-2","ca-central-1","us-west-2" \
    --notification-target "arn:aws:sns:us-east-1:111122223333:gamelift-test.fifo"
```

**注意**  
您可以使用機群或別名 ID 來呼叫 [describe-fleet-attributes](https://docs.aws.amazon.com/cli/latest/reference/gamelift/describe-fleet-attributes.html) 或 [describe-alias](https://docs.aws.amazon.com/cli/latest/reference/gamelift/describe-alias.html) 以取得機群與別名 ARN 值。

如果 `create-game-session-queue` 請求成功，Amazon GameLift Servers 即會傳回 [GameSessionQueue](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSessionQueue.html) 物件，其中包含新的佇列組態。您現在可以使用 [StartGameSessionPlacement](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StartGameSessionPlacement.html) 來提交請求到佇列。

**Example 使用玩家延遲政策建立佇列**  
下列範例會建立具有這些組態的遊戲工作階段佇列：  
+ 10 分鐘逾時
+ 三個機群目的地
+ 一組玩家延遲政策

```
aws gamelift create-game-session-queue \
    --name "matchmaker-queue" \
    --timeout-in-seconds 600 \
    --destinations DestinationArn=arn:aws:gamelift:us-east-1::alias/alias-a1234567-b8c9-0d1e-2fa3-b45c6d7e8910 \
               DestinationArn=arn:aws:gamelift:us-west-2::alias/alias-b0234567-c8d9-0e1f-2ab3-c45d6e7f8901 \
               DestinationArn=arn:aws:gamelift:us-west-2::fleet/fleet-f1234567-b8c9-0d1e-2fa3-b45c6d7e8912 \
    --player-latency-policies "MaximumIndividualPlayerLatencyMilliseconds=50,PolicyDurationSeconds=120" \
               "MaximumIndividualPlayerLatencyMilliseconds=100,PolicyDurationSeconds=120" \
               "MaximumIndividualPlayerLatencyMilliseconds=150" \
```

如果 `create-game-session-queue` 請求成功，Amazon GameLift Servers 即會傳回 [GameSessionQueue](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSessionQueue.html) 物件，其中包含新的佇列組態。

------

# 設定遊戲工作階段放置的事件通知
<a name="queue-notification"></a>

您可以使用事件通知來監控個別置放請求的狀態。我們建議為具有大量置放活動的所有遊戲設定事件通知。

設定事件通知有兩種選項。
+ 使用佇列將事件通知Amazon GameLift Servers發佈至 Amazon Simple Notification Service (Amazon SNS) 主題。
+ 使用自動發佈的 Amazon EventBridge 事件及其工具套件來管理事件。

如需 發出的遊戲工作階段置放事件清單Amazon GameLift Servers，請參閱 [遊戲工作階段置放事件](queue-events.md)。

**重要**  
對於大量置放系統，我們建議使用標準 （非 FIFO) Amazon SNS 主題，而不是 FIFO 主題。FIFO 主題的發佈限制低於標準主題，這可能會導致在高負載期間調節例外狀況。如果您使用 FIFO 主題遇到限流，可能會遺失佇列置放通知。

## 設定 SNS 主題
<a name="queue-notification-sns"></a>

若要Amazon GameLift Servers讓 將遊戲工作階段佇列產生的所有事件發佈至主題，請將通知目標欄位設定為主題。

**設定 Amazon GameLift Servers 事件通知用的 SNS 主題**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/sns/v3/home](https://console.aws.amazon.com/sns/v3/home)：// 開啟 Amazon SNS 主控台。

1. 在 SNS **主題**頁面中，選擇**建立主題**，然後依照指示建立您的主題。

1. 在**存取政策**下，執行下列動作：

   1. 選擇**進階**方法。

   1. 將 JSON 物件的下列粗體區段新增至現有政策。

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Id": "__default_policy_ID",
        "Statement": [
          {
            "Sid": "__default_statement_ID",
            "Effect": "Allow",
            "Principal": {
              "AWS": "*"
            },
            "Action": [
              "SNS:GetTopicAttributes",
              "SNS:SetTopicAttributes",
              "SNS:AddPermission",
              "SNS:RemovePermission",
              "SNS:DeleteTopic",
              "SNS:Subscribe",
              "SNS:ListSubscriptionsByTopic",
              "SNS:Publish"
            ],
            "Resource": "arn:aws:sns:us-east-1:111122223333:your_topic_name",
            "Condition": {
              "StringEquals": {
                "AWS:SourceAccount": "your_account"
              }
            }
          },
          {
            "Sid": "__console_pub_0",
            "Effect": "Allow",
            "Principal": { 
              "Service": "gamelift.amazonaws.com" 
            },
            "Action": "sns:Publish",
            "Resource": "arn:aws:sns:us-east-1:111122223333:your_topic_name",
            "Condition": {
              "ArnLike": {
              "aws:SourceArn": "arn:aws:gamelift:us-east-1:111122223333:gamesessionqueue/your_queue_name"
              }
            }
          }
        ]
      }
      ```

------

   1. （選用） 透過將條件新增至資源政策，將其他存取控制新增至主題。

1. 請選擇**建立主題**。

1. 建立 SNS 主題之後，請在建立佇列期間將其新增至佇列，或編輯現有的佇列以新增該主題。

## 使用伺服器端加密設定 SNS 主題
<a name="queue-notification-sns-sse"></a>

使用伺服器端加密 (SSE) 可讓您儲存加密主題中的敏感資料。SSE 使用 AWS Key Management Service (AWS KMS) 中管理的金鑰來保護 Amazon SNS 主題中的訊息內容。如需使用 Amazon SNS 進行伺服器端加密的詳細資訊，請參閱《*Amazon Simple Notification Service 開發人員指南*》中的[靜態加密](https://docs.aws.amazon.com/sns/latest/dg/sns-server-side-encryption.html)。

若要使用伺服器端加密設定 SNS 主題，請檢閱下列主題：
+ 《 *AWS Key Management Service 開發人員指南*》中的[建立金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) 
+ 《*Amazon Simple Notification Service 開發人員指南*》中的[為主題啟用 SSE](https://docs.aws.amazon.com/sns/latest/dg/sns-enable-encryption-for-topic.html) 

建立 KMS 金鑰時，請使用下列 KMS 金鑰政策：

```
{ 
    "Effect": "Allow", 
    "Principal": { 
        "Service": "gamelift.amazonaws.com" 
     },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": "*",
    "Condition": {
        "ArnLike": { 
            "aws:SourceArn": "arn:aws:gamelift:your_region:your_account:gamesessionqueue/your_queue_name" 
        },
        "StringEquals": { 
            "kms:EncryptionContext:aws:sns:topicArn": "arn:aws:sns:your_region:your_account:your_sns_topic_name" 
        }
    }
}
```

## 設定 EventBridge
<a name="queue-notification-cwe"></a>

Amazon GameLift Servers 會自動將所有遊戲工作階段置放事件發佈至 EventBridge。使用 EventBridge，您可以設定規則，將事件路由到目標進行處理。例如，您可以設定規則，將事件路由`PlacementFulfilled`到 AWS Lambda 函數，處理連線到遊戲工作階段之前的任務。如需 EventBridge 的詳細資訊，請參閱*《Amazon EventBridge 使用者指南》*中的[什麼是 Amazon EventBridge？](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)。

以下是要與Amazon GameLift Servers佇列搭配使用的 EventBridge 規則範例：

比對所有Amazon GameLift Servers佇列中的事件

```
{
    "source": [
        "aws.gamelift"
    ],
    "detail-type": [
        "GameLift Queue Placement Event"
    ]
}
```

符合來自特定佇列的事件

```
{
    "source": [
        "aws.gamelift"
    ],
    "detail-type": [
        "GameLift Queue Placement Event"
    ],
    "resources": [
        "arn:aws:gamelift:your_region:your_account:gamesessionqueue/your_queue_name"
    ]
}
```

## 使用 進行參考實作 AWS CDK
<a name="queue-notification-toolkit"></a>

如需使用 Amazon SNS AWS Lambda和 Amazon DynamoDB 進行事件型遊戲工作階段置放的完整參考實作，請參閱 Amazon GameLift Toolkit 中的[事件型遊戲工作階段置放指南](https://github.com/amazon-gamelift/amazon-gamelift-toolkit/tree/main/event-based-session-placement)。本指南包含部署完整事件驅動遊戲工作階段置放系統的 AWS CDK 範本，其中包含處理遊戲工作階段置放事件的 AWS Lambda 函數、用於追蹤遊戲工作階段置放狀態的 Amazon DynamoDB 資料表，以及Amazon GameLift Servers佇列組態的最佳實務。