Build Serverless FlexMatch


title: 构建无服务器 FlexMatch url: /flexmatch/lab25 weight: 60 pre: “2-5.


如何构建无服务器 FlexMatch

在本实验中,我们将基于无服务器架构启动 FlexMatch 匹配。

使用 FlexMatch,我们可以轻松实现基于会话的匹配器,而无需为其配置服务器。 要使用 FlexMatch,我们需要在游戏服务器或游戏客户端调用 FlexMatch API 或 SDK。 在本实验中,我们使用 Lambda。这种方法可以在游戏服务器后端实现成本效益高的无服务器模型。

配置 GameLift 队列

我们将使用 GameLift 队列进行匹配。

  1. 在 GameLift 控制台上点击"创建队列”。
  2. 如下图所示为队列命名。并在目标中选择我们之前创建的别名。点击"创建队列"完成创建。

  1. 接下来,我们为 FlexMatch 创建规则。点击"创建匹配规则集"按钮。

  2. 按照我们的意愿设置规则集名称,并在"规则集框"中放入以下规则集策略。规则集在给定源代码的 rootFolder/Ruleset 目录下的 GomokuRuleSet.json 文件中提供。复制代码并粘贴到控制台框中。

{
    "ruleLanguageVersion" : "1.0"
    "playerAttributes" :
    [
        {
            "name" : "score"
            "type" : "number"
            "default" : 1000
        }
    ]
    "teams" :
    [
        {
            "name" : "blue"
            "maxPlayers" : 1
            "minPlayers" : 1
        }
        {
            "name" : "red"
            "maxPlayers" : 1
            "minPlayers" : 1
        }
    ]
    "rules" :
    [
        {   "name": "EqualTeamSizes"
            "type": "comparison"
            "measurements": [ "count(teams[red].players)" ]
            "referenceValue": "count(teams[blue].players)"
            "operation": "="
        }
        {
            "name" : "FairTeamSkill"
            "type" : "distance"
            "measurements" : [ "avg(teams[*].players.attributes[score])" ]
            "referenceValue" : "avg(flatten(teams[*].players.attributes[score]))"
            "maxDistance" : 300
        }
    ]
    "expansions" :
    [
        {
            "target" : "rules[FairTeamSkill].maxDistance"
            "steps" :
            [
                {
                    "waitTimeSeconds" : 10
                    "value" : 500
                }
                {
                    "waitTimeSeconds" : 20
                    "value" : 800
                }
                {
                    "waitTimeSeconds" : 30
                    "value" : 1000
                }
            ]
        }
    ]
}

此规则匹配分数差异在300以下的玩家,如果匹配无法及时接受,则放宽匹配规则并寻找玩家!
点击"验证规则集”,检查规则集是否正确。然后点击"创建规则集”。

  1. 接下来要做的是链接 GameLift 队列和匹配规则集。在菜单中点击"创建匹配配置”。如下图所示选择队列和规则集,并创建配置。
  • 请检查我们选择了正确的区域和队列。

创建 Lambda 函数

如果我们部署了 CloudFormation 堆栈,Lambda 函数已经创建好了。我们只需要放入这些资源所需的部分。

GameLift FlexMatch 配置已完成!
下一步是构建 Lambda 函数和 API Gateway,供游戏客户端请求 FlexMatch。 在本实验中,我们将创建两个 Lambda 函数。第一个处理来自客户端的匹配请求,第二个检查匹配结果。
让我们创建第一个 Lambda 函数。这并不难!

  1. 转到 Lambda 控制台。https://console.aws.amazon.com/lambda

  2. 点击"创建函数"按钮。

  3. 选择"从头开始创作”。

  4. 将函数名称设为"game-match-request”。

  5. 选择 Python 3.9 作为运行时。

  6. 在权限选项卡中选择角色。选择"使用现有角色"并选择"Gomok-game-match-request"作为 IAM 角色。点击"创建函数"按钮。

  1. 在源代码中找到 Lambda/MatchRequest.py。复制内容并粘贴到控制台。检查区域和匹配配置是否正确配置。

  • 示例图片仅供参考。这可能与我们的实验环境不同。另外请检查处理程序和函数名称是否相同。
  1. 在函数上设置基本设置。
  • 内存:128MB
  • 超时:1 分钟
  1. 点击"保存"按钮并创建函数。此函数接收来自游戏客户端的匹配请求,从 DynamoDB 读取用户数据并向 GameLift 发送匹配请求。

  2. 点击"创建函数"按钮,让我们创建第二个函数。

  3. 选择"从头开始创作"并从空函数开始。

  4. 将名称设为"game-match-status”,并选择 Python 3.9 作为运行时。

  5. 在权限选项卡中选择角色。选择"使用现有角色"并选择"Gomok-game-match-status"作为 IAM 角色。点击"创建函数"按钮。

  6. 在源代码中找到 Lambda/MatchStatus.py。复制源代码并粘贴到 Lambda 代码文本框中。

  1. 与上面一样,在函数上设置基本设置。
  • 内存:128MB
  • 超时:1 分钟

请检查 Lambda 函数的 Handler。Lambda 函数执行时可以访问此处理程序。

  1. 点击"保存"按钮并创建函数。此函数通过使用游戏客户端发送的 TicketId 检查匹配请求是否完成,并将游戏服务器的 IP 地址和端口信息作为响应发送给游戏客户端。

API Gateway 配置

让我们为这些 Lambda 函数创建 API。

  1. 转到 API Gateway 控制台。(https://console.aws.amazon.com/apigateway)

  2. 选择已经创建的 API Gateway,并点击"创建资源"按钮。

  1. 在框中写入资源名称 matchrequest。选中"启用 API Gateway CORS"并点击"创建资源"按钮。

  1. 为此资源创建新方法。点击"操作"按钮和"创建方法”。为"POST"方法创建 API。

  2. 选择与 Lambda 函数的集成类型,并检查正确的区域。选择 game-match-request 作为 Lambda 函数并点击"保存"按钮。

  1. 为第二个 Lambda 函数创建第二个 API。在根路径上点击"操作"和"创建资源”。

  2. 按照我们之前的方式创建 API。资源名称将是 matchstatus 并启用 API Gateway CORS。

  1. 创建 POST 方法,并与 game-match-status Lambda 函数集成。点击"保存"按钮。

  2. 现在我们完成了为 Lambda 函数创建 API。让我们部署这个 API。点击"操作"按钮和"部署 API”。

  1. 部署 API 后,我们可以找到调用 URL。此 URL 将用于游戏客户端。


© 2020 Amazon Web Services, Inc. 或其附属公司,保留所有权利。