> For the complete documentation index, see [llms.txt](https://docs.edgegap.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.edgegap.com/zh/learn/pi-pei.md).

# 匹配

快速开始使用匹配，并探索各种类型的示例场景。

基于对战的游戏中的匹配系统通常旨在：

* **找到其他玩家** 基于诸如区域、延迟、技术水平或游戏参数等条件；
* **搜索服务器** 根据可用容量\[或延迟、区域、技术水平、地图、模式]加入；
* **启动新服务器** 如果现有服务器已满或不满足玩家条件。

玩家体验至上，定义我们的核心目标：

* 高对局填充率和社交功能整合（与好友组队游戏），
* 快速匹配且控制匹配质量（低延迟、共享偏好），
* 可靠且可预测的匹配流程并具有全球可用性。

{% hint style="success" %}
或者，让玩家 **从列表中选择一个持久的（始终在线）服务器** 带有 [服务器浏览器](/zh/learn/fu-wu-qi-liu-lan-qi.md).
{% endhint %}

跟随这段视频快速开始使用我们的匹配器服务：

{% embed url="<https://youtu.be/HxtvzvJ1FTk>" %}

## ✔️ 准备工作

**测试此服务完全免费，无需信用卡。**

免费额度允许在我们的共享测试集群上每次重启后最多运行 3 小时。

本教程假定您已经：

* [理解 Edgegap 的部署模型](https://docs.edgegap.com/zh/learn/pages/5e7e2169ca3822647d4607dfc1d3487ebcc0836c#id-1.-just-in-time-deployment-dedicated-servers),
* 已在 Edgegap 上发布您的服务器应用（[Unreal Engine](/zh/unreal-engine.md), [Unity](/zh/unity.md)),
* 已从游戏客户端成功连接到您在 Edgegap 上的服务器。

### 匹配架构

本指南将重点介绍 **匹配 API 和回填 API**.

<figure><img src="/files/fe013a71de7648fe768ae17a1c3ad6d61236a480" alt=""><figcaption></figcaption></figure>

在涉及匹配时，有四（4）个重要的数据流：

1. [匹配 API](/zh/learn/pi-pei/matchmaker-in-depth.md#matchmaking-api) **由游戏客户端用于与匹配器通信：**
   1. 用于组管理、服务器分配和监控，
   2. 用于与 [Ping 信标](/zh/learn/bian-pai/ping-beacons.md).
2. [部署](/zh/learn/bian-pai/deployments.md) API 由匹配器用于部署、扩展和管理您的专用服务器。
3. [Netcode 传输](/zh/docs/sample-projects.md) 用于在游戏客户端和专用服务器之间通信。
4. [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#backfill-match) **用于替换或添加正在运行的服务器中的玩家。**

{% hint style="info" %}
发布后， **您的匹配器需要 24/7 运行** 以确保全球各地的玩家都能加入服务器。
{% endhint %}

## 🍀 简单示例

从一个简单示例开始，并测试基本的匹配玩家流程：

* 在共享的上创建匹配器实例 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#hosting-cluster),
* 在您的匹配器中定义规则和设置 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#configuration),
* 使用以下方式测试玩家流程并管理票据 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#matchmaking-api).

### 1. 在免费套餐上设置

☑️ [注册您的免费 Edgegap 账户](https://app.edgegap.com/auth/register) 并打开 [匹配器仪表板页面](https://app.edgegap.com/matchmaker-management-v2/matchmakers/list).

☑️ 点击 **创建匹配器** ，然后输入：

* 匹配器名称 - 仅供您自己参考，例如 `quickstart-dev` ,
* 上传我们的简单示例 JSON 配置。

🍀 **简单示例（最小推荐配置）：**

{% hint style="danger" %}
**请确保更改应用程序** **`名称`**  **和** **`版本`**  **以匹配您的** [应用与版本](/zh/learn/bian-pai/application-and-versions.md).
{% endhint %}

<pre class="language-json"><code class="lang-json">{
  "版本": "3.2.5",
  "检查": true,
  "最大部署重试次数": 3,
  "配置文件": {
    "simple-example": {
      "ticket_expiration_period": "5m",
      "票证移除时长": "1m",
      "组不活跃移除时长": "5m",
      "应用": {
        "name": "<a data-footnote-ref href="#user-content-fn-1">my-game-server</a>",
        "version": "<a data-footnote-ref href="#user-content-fn-2">2024.01.30-16.23.00-UTC</a>"
      },
      "规则": {
        "初始": {
          "匹配大小": {
            "type": "player_count",
            "属性": {
              "team_count": 1,
              "min_team_size": 2,
              "max_team_size": 2
            }
          },
          "信标": {
            "type": "latencies",
            "属性": {
              "difference": 100,
              "max_latency": 200
            }
          }
        },
        "expansions": {}
      }
    }
  }
}
</code></pre>

**故障排查与常见问题：**

<details>

<summary><code>应用配置对于配置文件 XYZ 无效。</code></summary>

* 我们找不到您的 [应用与版本](/zh/learn/bian-pai/application-and-versions.md)，请验证 `应用`  值。

</details>

<details>

<summary><code>标签为 '2024.01.30-16.23.00-UTC' 的 Docker 镜像未被缓存。</code></summary>

[**🌟 升级到按需付费等级**](https://app.edgegap.com/user-settings?tab=memberships) **以解锁** [**具有缓存的即时部署**](https://docs.edgegap.com/zh/learn/pages/5e7e2169ca3822647d4607dfc1d3487ebcc0836c#id-1.-start-a-deployment)**.**

* 4GB 以上未缓存的镜像可能需要更长时间部署，导致 [/pages/5e7e2169ca3822647d4607dfc1d3487ebcc0836c#id-4.-deployment-error](https://docs.edgegap.com/zh/learn/pages/5e7e2169ca3822647d4607dfc1d3487ebcc0836c#id-4.-deployment-error "mention")。请考虑优化您的服务器镜像大小（[虚幻引擎](/zh/unreal-engine.md#optimize-server-build-size) / [Unity](/zh/unity.md#optimize-server-build-size)).
* 您仍然可以继续，但我们建议测试您的部署时间。

</details>

☑️ 如果没有出现验证错误，请点击 **创建并启动** 并等待流程完成。这将启动一个新的免费集群，并运行您的简单示例匹配器。

✅ 现在您可以继续下一步。

### 2. 探索配置

随着我们发布匹配器更新，每个新版本都使用 [语义化版本](/zh/learn/pi-pei/matchmaker-in-depth.md#changelog) 通过解析格式清晰传达变更影响 `主版本.次版本.修订版本`:

* 🔥 `主版本` 版本包含破坏性变更，需要进行集成审查，
* 🌟 `次版本` 版本包含大量向后兼容的改进，
* 🩹 `修订版本` 版本包含错误修复和小幅改进。

[检查票据](/zh/learn/pi-pei/matchmaker-in-depth.md#matchmaking-api) 以便在开发期间更好地理解并调试可能的匹配流程。我们建议为线上匹配器禁用 inspect API。

**某些** [**部署可能会出现错误**](https://docs.edgegap.com/zh/learn/pages/5e7e2169ca3822647d4607dfc1d3487ebcc0836c#id-4.-deployment-error)**.** 我们会通过最多重试部署 `max_deployment_retry_count` 次来自动解决此问题（无需客户端确认）。

为确保意外的客户端崩溃或被放弃的票据不会长时间占用您的匹配器资源，未匹配的票据将在 `ticket_expiration_period` 之后状态将变为 `CANCELLED` ，并在 `ticket_removal_period` .

{% hint style="info" %}
[了解匹配器如何最大化匹配填充率并将排队时间缩短到 10 秒以下。](/zh/learn/pi-pei/matchmaker-in-depth.md#find-match)
{% endhint %}

我们的匹配逻辑核心配置在 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#matchmaking-profiles)。每个配置档案都是一个完全隔离的匹配队列，指向 [应用与版本](/zh/learn/bian-pai/application-and-versions.md#app-versions) 并预先定义所需的 CPU 和内存（RAM）资源数量。

[深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#matchmaking-rules) 中的初始规则集必须满足，玩家才能被分到一起，每条规则都由三个属性定义：

* 您自定义的名称，例如 - `匹配大小`,
* 规则类型，也称为操作符，例如 - `player_count`,
* 最后是操作符属性，例如 `team_count` 或 `max_team_size`.

**玩家数量规则**

这是一个特殊规则，用于定义启动分配所需匹配的玩家数量：

* `team_count` 表示队伍数量，1 支队伍可用于合作或大逃杀模式，
* `min_team_size` 表示每队最少玩家数。
* `max_team_size` 表示每队最多玩家数。

我们的简单示例演示了一个 2 人合作游戏。

{% hint style="warning" %}
玩家数量规则 **是必需的，并且只能定义一次** 在你的初始配置规则中。
{% endhint %}

**延迟规则**

**`延迟`** 是一条特殊规则，用于优化玩家匹配的 ping：

* 通过移除延迟高（超过阈值）的区域来降低客户端-服务器延迟，
* 通过将延迟相近（差值低于指定值）的玩家分组来提高匹配公平性。

<details>

<summary>规则示例： <code>信标</code></summary>

`信标` 已配置为以下内容的规则 `"difference": 100, "max_latency": 200`  将匹配：

:white\_check\_mark: Alice 和 Bob 可能匹配：

* 东京被丢弃（>200 毫秒），
* 芝加哥的延迟绝对差在 100 毫秒以内。

<table><thead><tr><th width="180">信标城市</th><th width="80">匹配</th><th width="132">abs(A - B) [毫秒]</th><th width="164">Alice [毫秒]</th><th width="164">Bob [毫秒]</th></tr></thead><tbody><tr><td>芝加哥</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>75.0</td><td>12.3</td><td>87.3</td></tr><tr><td>洛杉矶</td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><a data-footnote-ref href="#user-content-fn-3">113.2</a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td>145.6</td><td>32.4</td></tr><tr><td><del>东京</del></td><td>不适用</td><td>不适用</td><td><a data-footnote-ref href="#user-content-fn-4"><del>233.2</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><a data-footnote-ref href="#user-content-fn-4"><del>253.2</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr></tbody></table>

:x: Alice 和 Charlie 永远不会匹配：

* 没有任何信标对两位玩家都具有 < 200 毫秒的延迟，
* Alice 住在北美 - 伊利诺伊州，
* Charlie 住在亚洲 - 日本。

<table><thead><tr><th width="180">信标城市</th><th width="80">匹配</th><th width="132">abs(A - B) [毫秒]</th><th width="164">Alice [毫秒]</th><th width="164">Charlie [毫秒]</th></tr></thead><tbody><tr><td><del>芝加哥</del></td><td>不适用</td><td>不适用</td><td>12.3</td><td><a data-footnote-ref href="#user-content-fn-4"><del>215.6</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr><tr><td><del>洛杉矶</del></td><td>不适用</td><td>不适用</td><td>145.6</td><td><a data-footnote-ref href="#user-content-fn-4"><del>238.3</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr><tr><td><del>东京</del></td><td>不适用</td><td>不适用</td><td><a data-footnote-ref href="#user-content-fn-4"><del>233.2</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td>24.2</td></tr></tbody></table>

</details>

{% hint style="warning" %}
规则 `延迟`  是 **可选，并且只能在你的初始配置中定义一次** 规则。
{% endhint %}

✅ 现在您可以继续下一步。

### 3. 查看实例详情

☑️ 实例初始化完成后，请在仪表板中查看您的新匹配器详情：

<figure><img src="/files/11f34fb482d6d00cb6185999fd11c70ef3e84b7b" alt=""><figcaption></figcaption></figure>

* **状态** 表示服务健康状况，可能为 ONLINE、OFFLINE 或 ERROR。
* **标识符** 在您需要故障排查帮助时，能帮助 Edgegap 员工快速找到您的匹配器。
* **启动时间** 可用于追踪最近的更新时间。
* **大小** 对应我们的某个 [价格层级](https://edgegap.com/resources/pricing#matchmaker).
* **API URL** 将由游戏客户端和游戏服务器用于与您的匹配器通信。
* **Swagger URL** 是我们提供的一个方便的 OpenAPI 规范界面，用于浏览 API 架构。
* **认证令牌** 是游戏客户端和游戏服务器用于身份验证的唯一密钥令牌。

{% hint style="danger" %}
**Edgegap 员工绝不会向您索要令牌。如果怀疑发生安全泄露，请重新生成令牌。**
{% endhint %}

要测试您的新匹配器， **您需要 Swagger URL、API URL 和认证令牌**.

✅ 现在您可以继续下一步。

{% hint style="info" %}
要在开发中更新匹配器规则，请编辑配置并重启。
{% endhint %}

{% hint style="success" %}
请参见 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#rolling-updates-and-ab-tests) 用于正式游戏和零停机更新。
{% endhint %}

### 4. 测试 Tickets API

{% hint style="info" %}
**请等待最多 5 分钟** 在启动匹配器后，以便 DNS 传播完成。
{% endhint %}

☑️ 首先， **打开您的 Swagger URL** 以在 swagger 界面中查看您的 OpenAPI 架构：

<figure><img src="/files/11fa0873064f09de0a136d451135fb73562759f9" alt=""><figcaption></figcaption></figure>

☑️ 点击 **授权** 🔒，粘贴您的 **认证令牌**，然后点击确认 **授权**.

<figure><img src="/files/2cbd5cc15d68f8ede554c23d9ee3de64522dfe3a" alt=""><figcaption></figcaption></figure>

☑️ 向下滚动到 **票据 API** **- POST /tickets**，展开并点击 **试用**.

<figure><img src="/files/89ae6ce798696894fd0c5257a559d87f1dbcf782" alt=""><figcaption></figcaption></figure>

☑️ 预览您的请求：

* 注意 `player_ip` 设置为 `null` - 这将使匹配器使用自动添加到您请求中的 IP 地址（请参见 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#server-to-server-api) 了解其他替代方案），
* `profile` 指的是您的 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#matchmaking-profiles),
* `attributes` 包含您的匹配器规则值，在本例中是 `延迟` 规则，
  * 规则 `player_count` 这是唯一一个在玩家票据中不需要任何属性的规则。

☑️ 点击 **执行** 并查看您的玩家票据请求响应：

* `id` 是您唯一的匹配票据 ID，请保存它以便稍后检查票据，
* `profile` 确认了 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#matchmaking-profiles),
* `group_id` 是一个唯一的 [分配给每张票据的组 ID，单人玩家将表示为 1 人组](/zh/learn/pi-pei/matchmaker-in-depth.md#group-up),
* `team_id` 是分配给每位玩家的唯一队伍 ID，一旦 `TEAM_FOUND` 状态被达到，
  * [每支队伍可以包含多个组，但不能超过配置的队伍大小](/zh/learn/pi-pei/matchmaker-in-depth.md#matchmaking-rules),
* `player_ip` 是玩家解析后的公网 IP 地址，无论识别方法如何，
* `分配` 被设置为 `null` ，表示该票据尚未匹配或分配到服务器，
* `created_at` 提供有关玩家票据创建时间的信息，用于游戏 UI，
* `状态` 表示票据的当前状态，所有票据都从 `SEARCHING` .

<figure><img src="/files/eb2893f57a4753a6c01060afbe11ee7b42cc9c2a" alt=""><figcaption></figcaption></figure>

☑️ 通过点击 **执行** 再次创建第二张票据，这样我们的两个玩家就会匹配并启动服务器。

☑️ 折叠 POST /tickets 并打开 **GET /tickets/{ticketId}**，然后点击 **试用**.

☑️ 输入上一步响应中的票据 ID，然后点击 **执行**.

<figure><img src="/files/c6f82025f664c8d8a059299c854a868ef03b33a7" alt=""><figcaption></figcaption></figure>

☑️ 查看您的玩家票据更新后的分配：

* 状态已变为 `MATCH_FOUND` 首先，同时保留 `分配` 设置为 `null` ，表示玩家已匹配且正在分配服务器，

<figure><img src="/files/acb5fb7630131fe8e98470e7a5d582a6b641ff25" alt=""><figcaption></figcaption></figure>

☑️ 点击 **执行** 再次检查您的票据，并查看票据更新后的分配：

* 状态已变为 `HOST_ASSIGNED` ，使用 `分配` 包含已分配服务器的详细信息。

<figure><img src="/files/4a23f825a091a8d495cde3932cbccb58ce8c4065" alt=""><figcaption></figcaption></figure>

<details>

<summary>故障排查与常见问题</summary>

我的票证卡在 `SEARCHING` .

* 请确认您已根据配置创建了足够多、且条件重叠的票据。

***

我的票证卡在在以下状态之间切换： `MATCH_FOUND` 和 `TEAM_FOUND` 反复。

* 免费套餐账户一次只能有 1 个部署。请考虑升级，或停止当前部署后再启动新的部署。

***

我的票证直接进入 `CANCELLED`.

* 您的票据已过期。请重新创建新票据，或在配置中延长过期时间以便测试。

***

检查我的票据时收到 HTTP 404 Not Found。

* 你的票证已通过 DELETE 请求删除，或因达到其移除时长（在票证过期后开始，由你的配置定义）而被删除。请重新创建新票证，或增加配置中的过期/移除时长以供测试。

</details>

☑️ [在仪表板中检查您的新部署](https://app.edgegap.com/deployment-management/deployments/list):

* 请注意，每个部署都会标记所有票据 ID 和配置档案，以增强可追溯性。

<figure><img src="/files/3745b7b0cd47d8d4955961e3c3ea07824785bfe6" alt=""><figcaption></figcaption></figure>

在找到匹配后几秒，成员资格将继续进入 `状态：HOST_ASSIGNED`  这表明你的 [部署现已就绪，游戏服务器正在初始化](https://docs.edgegap.com/zh/learn/pages/5e7e2169ca3822647d4607dfc1d3487ebcc0836c#id-3.-deployment-ready).

每位玩家读取其 `ticket_id`  和  `分配`  并尝试使用以下方式连接 [**FQDN**](#user-content-fn-5)[^5] **（部署 URL）** 以及 **外部端口**。此时你的游戏服务器可能仍在初始化，因此 **玩家必须多次重试连接**，直到超过你通常的服务器初始化时间：

{% tabs %}
{% tab title="Unreal Engine" %}
为了 **从 PIE（编辑器）连接** 在开发和测试期间，按波浪号键 `~`  并输入 `open {URL}:{port}`  并等待编辑器加载地图。

为了 **从游戏客户端构建连接** （在正式生产环境中）尝试

* Unreal Engine [⚡ 集成套件](https://docs.edgegap.com/learn/unreal-engine-games/developer-tools#integration-kit):
  * [从 Fab Marketplace 安装](https://www.fab.com/listings/ff17ad88-12a1-49cf-9a41-31695ed11e16) （个人使用免费），
  * [导入简单示例蓝图](https://blueprintue.com/blueprint/m33u1okj/) 并根据你的需要进行自定义。

{% hint style="success" %}
如果连接失败或出现黑屏，请查阅我们的 [故障排除指南](/zh/unreal-engine.md#troubleshooting-and-faq).
{% endhint %}
{% endtab %}

{% tab title="Unity" %}
为了 **连接你的 Unity 编辑器** 或 **游戏客户端** 到你的云部署，请输入：

* **部署** **URL** 指向服务器 IP，通常在 `NetworkManager` 组件中。
* **外部端口** 映射到 [服务器的内部监听端口](/zh/learn/bian-pai/application-and-versions.md#port-mapping)，通常在 Transport 组件中。

{% hint style="success" %}
如果连接超时或遇到其他问题，请查阅我们的 [故障排除指南](/zh/unity.md#troubleshooting-and-faq-4).
{% endhint %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}
我们不会要求玩家确认匹配，因为我们的目标是尽可能缩短进入游戏的时间、提高匹配填充率，并尽量减少排队逃避和匹配取消。
{% endhint %}

游戏客户端应 **在游戏重启之间持久保存其分配 ID**，以便在游戏客户端崩溃时能够检索连接详情并尝试重新连接。

☑️ 尝试从您的游戏客户端连接到已分配的服务器。

{% hint style="warning" %}
如果您遇到较高延迟，您的 netcode 集成可能被配置为模拟网络延迟。 **测试时请关闭 VPN** 以获得更真实的条件，并获得一个 [低延迟部署](/zh/learn/bian-pai/deployments.md#server-placement).
{% endhint %}

☑️ 一旦您确认能够无问题连接到您的部署并完成测试， **停止您的部署** 以释放您账户中的容量，供下一个构建使用。

✅ 现在您可以继续下一步。

{% hint style="info" %}
可在以下位置找到用于测试的 OpenAPI 规范： `{matchmaker-url}/swagger/v1/swagger.json`.
{% endhint %}

### 5. 游戏集成

匹配器可与以下内容集成：

* **游戏客户端**，用于 [管理组、成员关系、分配和票据](/zh/learn/pi-pei/matchmaker-in-depth.md#group-up),
* **专用服务器**，用于 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#backfill-match) 在玩家离开后。

☑️ 在 **游戏客户端**中，我们建议使用游戏内 UI 向玩家提供票据状态更新，以获得最佳玩家体验。参见：

* Unity [开发者工具](/zh/unity/developer-tools.md#software-development-kit):
  * [使用 Unity Package Manager 免费安装包](https://github.com/edgegap/edgegap-unity-sdk),
  * [探索我们的入门指南和完整示例](/zh/unity/pi-pei.md).
* 虚幻引擎 [开发者工具](/zh/unreal-engine/developer-tools.md#integration-kit):
  * [阅读文档](https://egik.betide.studio/) 由 Betide Studios，
  * [从 Fab Marketplace 安装](https://www.fab.com/listings/ff17ad88-12a1-49cf-9a41-31695ed11e16) （个人使用免费），
  * [导入简单示例蓝图](https://blueprintue.com/blueprint/m33u1okj/) （匹配）并根据你的需要进行自定义。

☑️ 在 **游戏客户端**，请确保处理可重试的 `429 请求过多`  错误，并采用指数退避和重试机制，让匹配器有时间在突发流量激增期间恢复。

☑️ 在 **游戏客户端**，请确保处理不可重试的错误：

* `404 Not Found` - 票据已被删除，
* `500 Internal Server Error` - 临时服务中断。

☑️ 在 **游戏服务器**，读取玩家偏好和初始服务器上下文：

1. [注入变量（匹配器）](/zh/learn/pi-pei/matchmaker-in-depth.md#injected-environment-variables) **用于检索初始玩家的匹配数据。**
2. [注入变量（应用版本）](/zh/learn/bian-pai/application-and-versions.md#other-parameters-optional) 用于版本参数、设置和密钥。
3. [注入变量（部署）](/zh/learn/bian-pai/deployments.md#injected-environment-variables) 用于部署信息、IP、位置等...

{% hint style="info" %}
一旦就绪，部署会被分配一个 URL（ [服务器状态可能会丢失](https://learn.microsoft.com/en-us/dotnet/api/system.environment.getenvironmentvariable?view=net-8.0) 注入的变量（Injected Variables） [游戏服务器通常需要额外信息，例如服务器 IP、内部端口值等。注入只读环境变量是传递参数的一种可靠且与云无关的方式。](https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Core/GenericPlatform/FGenericPlatformMisc/GetEnvironmentVariable) 获取变量值。
{% endhint %}

☑️ 一旦玩家连接， **游戏服务器和游戏客户端** 启动加载场景——3D 场景、类似大厅的社交 UI，或带进度条的加载界面，以表明初始化正在进行。

☑️ 确保您的 [部署将被停止](https://docs.edgegap.com/docs/deployment#stop-a-deployment) 在比赛结束后正确完成。

🙌 恭喜，您已完成匹配集成！想了解更多，请继续阅读。

## 🏁 高级示例

一个完整的配置，利用了所有匹配功能，包括 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#matchmaking-profiles), [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#matchmaking-rules)，而 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#rule-expansion) 可能如下所示：

<details>

<summary>🏁 高级示例（完整示例配置）</summary>

```json
{
  "version": "3.2.5",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "allowed_cors_origins": [
    "https://*.my-game-server.com"
  ],
  "profiles": {
    "advanced-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 125
            }
          },
          "elo_rating": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 50
            }
          },
          "selected_game_mode": {
            "type": "string_equality"
          },
          "selected_map": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "elo_rating": {
              "max_difference": 150
            },
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          },
          "60": {
            "elo_rating": {
              "max_difference": 200
            }
          },
          "180": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 4
            },
            "beacons": {
              "difference": 99999,
              "max_latency": 99999
            }
          }
        }
      }
    }
  }
}
```

</details>

## 🥛 回填展示

在 [#simple-example](#simple-example "mention")的基础上，这个配置展示了 [回填](/zh/learn/pi-pei/matchmaker-in-depth.md#backfill-match) ，使用 [组](/zh/learn/pi-pei/matchmaker-in-depth.md#group-up).

<details>

<summary><span data-gb-custom-inline data-tag="emoji" data-code="1f95b">🥛</span> 回填配置示例</summary>

```json
{
  "version": "3.2.5",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "backfill-example": {
      "ticket_expiration_period": "30s",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 100,
              "max_latency": 200
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {}
      }
    }
  }
}
```

</details>

可选地，某些游戏可能有特殊的匹配需求，例如：

* 允许新玩家加入进行中的游戏（好友或“randoms”），
* 在服务器启动后替换中途离开的玩家（离开者），以避免重新开始对局，
* 允许观众加入并观看锦标赛或好友的比赛（电子竞技），
* 将玩家集中到更大的服务器中，以提供更多社交互动（MMO）。

回填是一种 **由服务器持有的票据，表示当前连接到服务器的玩家。** 这可确保新加入的玩家在与当前玩家匹配时遵守你的匹配规则。

{% hint style="warning" %}
[深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#backfill-match) 用于替换 Seat/Match 会话。匹配器仅支持 Default 会话。
{% endhint %}

<figure><img src="/files/b2aa022802913682f9fad04145e9161440cc6e17" alt=""><figcaption><p>回填场景可视化</p></figcaption></figure>

{% hint style="success" %}
**回填会忽略** `player_count`  **规则，并且始终精确匹配一个组**. `backfill_group_size`  使用轮询策略控制队伍容量，以受控且均匀的方式补满队伍。
{% endhint %}

**完成一次成功回填的步骤如下：**

1. 服务器为每个缺少玩家的队伍创建一个回填，使用以下值：
   * 真实 `分配`  从以下来源获取的数据 [部署](/zh/learn/bian-pai/deployments.md#injected-environment-variables) （部署）。
   * 当前已连接玩家的 `票据`:
     * 来自 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#injected-variables) （匹配器），之前回填的 `assigned_ticket` 响应，或经过修改以匹配特定玩家的模拟数据，
     * 替换 `backfill_group_size`  将值替换为可能的组大小 直至可用容量[^6],
2. 游戏客户端创建新的票据（成员资格）并包含 `backfill_group_size`  值：
   * `"1"`  如果玩家单独进行匹配。
   * [`"2"`  如果玩家属于一个总人数为 2x 的匹配组](#user-content-fn-7)[^7].
   * `"新建",`  如果玩家除了加入进行中的游戏外，还启用了开始新游戏。
3. 游戏客户端随后 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#find-match) 并将玩家与匹配到的回填进行配对。
4. 如果回填后的组未能完全填满队伍，服务器可以使用新回填玩家的票据重复此过程，以添加更多玩家并达到所需的队伍人数。

{% hint style="success" %}
回填会忽略队伍大小规则，并且始终让 1 个回填与 1 个组匹配。 **若只与回填匹配并禁用与队列中其他玩家的匹配，请设置 `min_team_size: 999999` .**
{% endhint %}

<details>

<summary>🥛 回填示例（回填展示）</summary>

```json
{
  "profile": "backfill-example",
  "属性": {
    "assignment": {
      "request_id": "cd28e6c66554",
      "fqdn": "cd28e6c66554.pr.edgegap.net",
      "public_ip": "192.168.2.14",
      "ports": {
        "game": {
          "internal": 7777,
          "external": 56890,
          "link": "cd28e6c66554.pr.edgegap.net:56890",
          "protocol": "UDP"
        },
        "web": {
          "internal": 22,
          "external": 57440,
          "link": "cd28e6c66554.pr.edgegap.net:57440",
          "protocol": "TCP"
        },
        "server": {
          "internal": 80,
          "external": 50110,
          "link": "cd28e6c66554.pr.edgegap.net:50110",
          "protocol": "TCP"
        }
      },
      "location": {
        "city": "蒙特利尔",
        "country": "加拿大",
        "continent": "北美洲",
        "administrative_division": "魁北克",
        "timezone": "America/Toronto"
      }
    }
  },
  "tickets": {
    "c3d057h5h6f7j889fk43": {
      "player_ip": "174.25.48.238",
      "属性": {
        "信标": {
          "纽约": 12.2,
          "洛杉矶": 45.3,
          "巴黎": 78.3
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "192bb97e-7fd6-4d86-8ce4-61c53c9fef16",
      "id": "c3d057h5h6f7j889fk43",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    },
    "cqg0bg9583s738h9dkf6": {
      "player_ip": "217.34.85.142",
      "属性": {
        "信标": {
          "纽约": 21.0,
          "洛杉矶": 30.2,
          "巴黎": 101.1
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "aea7df3c-d391-4ea3-a3ec-dded422fe7c8",
      "id": "cqg0bg9583s738h9dkf6",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    }
  },
  "assigned_ticket": null
}
```

</details>

<details>

<summary>🥛 回填分配示例（回填展示）</summary>

```json
{
  "profile": "backfill-example",
  "属性": {
    "assignment": {
      "request_id": "cd28e6c66554",
      "fqdn": "cd28e6c66554.pr.edgegap.net",
      "public_ip": "192.168.2.14",
      "ports": {
        "game": {
          "internal": 7777,
          "external": 56890,
          "link": "cd28e6c66554.pr.edgegap.net:56890",
          "protocol": "UDP"
        },
        "web": {
          "internal": 22,
          "external": 57440,
          "link": "cd28e6c66554.pr.edgegap.net:57440",
          "protocol": "TCP"
        },
        "server": {
          "internal": 80,
          "external": 50110,
          "link": "cd28e6c66554.pr.edgegap.net:50110",
          "protocol": "TCP"
        }
      },
      "location": {
        "city": "蒙特利尔",
        "country": "加拿大",
        "continent": "北美洲",
        "administrative_division": "魁北克",
        "timezone": "America/Toronto"
      }
    }
  },
  "tickets": {
    "c3d057h5h6f7j889fk43": {
      "player_ip": "174.25.48.238",
      "属性": {
        "信标": {
          "纽约": 12.2,
          "洛杉矶": 45.3,
          "巴黎": 78.3
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "192bb97e-7fd6-4d86-8ce4-61c53c9fef16",
      "id": "c3d057h5h6f7j889fk43",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    },
    "cqg0bg9583s738h9dkf6": {
      "player_ip": "217.34.85.142",
      "属性": {
        "信标": {
          "纽约": 21.0,
          "洛杉矶": 30.2,
          "巴黎": 101.1
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "aea7df3c-d391-4ea3-a3ec-dded422fe7c8",
      "id": "cqg0bg9583s738h9dkf6",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    }
  },
  "assigned_ticket": {
    "profile": "backfill-example",
    "player_ip": "244.13.201.244",
    "属性": {
      "信标": {
        "纽约": 30.2,
        "洛杉矶": 10.5,
        "巴黎": 123.9
      },
      "backfill_group_size": [
        "新建",
        "1"
      ]
    },
    "id": "cqg0bg550h7uujd77khg",
    "group_id": "e0cf41c0-f88f-456e-a032-03b1d6821a9a",
    "created_at": "2024-08-20T13:38:08.251393+00:00",
    "status": "HOST_ASSIGNED"
  }
}
```

</details>

{% hint style="info" %}
请参见 [Mirror 座位管理](https://docs.edgegap.com/docs/sample-projects/mirror-on-edgegap#bonus-seat-sessions-management) 和 [FishNet 座位管理](https://docs.edgegap.com/docs/sample-projects/fishnet-on-edgegap#bonus-seat-sessions-management) 的缓存错误，适用于 **玩家连接监控**.
{% endhint %}

## ⚔️ 竞技游戏

竞技游戏侧重于玩家彼此竞争以取得胜利，无论是个人（大逃杀）还是团队。通过将技能水平相近的玩家或队伍配对，确保公平平衡的比赛，并通过快速找到公平的对手来保持游戏节奏。

<details>

<summary>⚔️ 竞技游戏示例</summary>

```json
{
  "version": "3.2.5",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "casual-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          },
          "180": {
            "beacons": {
              "difference": 99999,
              "max_latency": 99999
            }
          }
        }
      }
    },
    "competitive-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "versus_ranks": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "120": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          }
        }
      }
    },
    "challenger-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "elo_rating": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 50
            }
          }
        },
        "expansions": {
          "120": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          }
        }
      }
    }
  }
}
```

</details>

您可以 **定义多个队伍，每队 1 名或更多玩家**，例如：

<table><thead><tr><th width="300">游戏模式</th><th>队伍数量</th><th>队伍大小</th><th>总玩家数</th></tr></thead><tbody><tr><td>5v5 FPS</td><td>2</td><td>5</td><td><strong>10</strong></td></tr><tr><td>5v5 MOBA</td><td>2</td><td>5</td><td><strong>10</strong></td></tr><tr><td>20x3 大逃杀</td><td>20</td><td>3</td><td><strong>60</strong></td></tr><tr><td>10人自由对战</td><td>1</td><td>10</td><td><strong>10</strong></td></tr></tbody></table>

定义多个 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#matchmaking-profiles) 用于游戏模式特定的规则和设置，并且 [根据需要扩展](/zh/learn/pi-pei/matchmaker-in-depth.md#rule-expansion).

* **对于所有比赛：**
  * 限制 [匹配延迟](/zh/learn/pi-pei/matchmaker-in-depth.md#ping-optimization) 以防止匹配到远处的玩家，
  * [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#group-up) 用于预组队，并防止超过队伍大小，
  * 随着时间逐步放宽延迟限制，以找到更多玩家，
  * 通过不同的 [应用与版本](/zh/learn/bian-pai/application-and-versions.md#app-versions) 为特定配置档案分配更多 CPU 或内存，
* **对于休闲比赛：**
  * 省略段位限制，以最大化匹配速度和匹配填充率，
  * 让玩家提供他们的地图偏好，以找到适合所有人的地图，
  * 指定回填组大小，以替换离开者且不超过队伍大小，
  * 移除延迟限制，以保证在 3 分钟（180 秒）排队时间后一定能匹配到对局。
* **对于竞技比赛：**
  * 限制段位，只允许技能水平相近的对手，
  * 使用升段或降段等级来匹配联赛段位极端区间的玩家。
* **对于前 1% 的高水平比赛（挑战者）：**
  * 使用数值型技能评分（ELO）来精细控制比赛中的技能分布，
  * 由于玩家数量较少，在放宽延迟要求前等待更长时间。

{% hint style="success" %}
使用多个配置档案来 **分离休闲游戏模式、竞技游戏模式和顶级挑战者** 玩家，可以让您针对每类玩家分别自定义规则和扩展策略。
{% endhint %}

## 🤝 合作游戏

合作游戏要求玩家作为团队共同朝着同一目标，或对抗 AI 对手。将偏好和玩法习惯相似的玩家匹配在一起。替换离开的玩家，并改善 [Ping 信标](/zh/learn/bian-pai/ping-beacons.md#connection-quality) 以提供响应迅速的玩家体验。

<details>

<summary>🤝 合作游戏示例</summary>

```json
{
  "版本": "3.2.5",
  "检查": true,
  "最大部署重试次数": 3,
  "配置文件": {
    "cooperative-example": {
      "票证过期时长": "3m",
      "票证移除时长": "1m",
      "组不活跃移除时长": "5m",
      "应用": {
        "名称": "my-game-server",
        "版本": "2024.01.30-16.23.00-UTC"
      },
      "规则": {
        "初始": {
          "匹配大小": {
            "type": "player_count",
            "属性": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "信标": {
            "type": "latencies",
            "属性": {
              "差值": 125,
              "最大延迟": 150
            }
          },
          "selected_difficulty": {
            "type": "string_equality"
          },
          "selected_map": {
            "类型": "交集",
            "属性": {
              "重叠": 1
            }
          },
          "player_level": {
            "type": "number_difference",
            "属性": {
              "max_difference": 10
            }
          },
          "回填组大小": {
            "类型": "交集",
            "属性": {
              "重叠": 1
            }
          },
          "审核标志": {
            "类型": "交集",
            "属性": {
              "重叠": 1
            }
          }
        },
        "扩展": {
          "30": {
            "信标": {
              "差值": 125,
              "最大延迟": 250
            },
            "player_level": {
              "max_difference": 20
            }
          },
          "60": {
            "匹配大小": {
              "team_count": 1,
              "min_team_size": 2,
              "max_team_size": 4
            }
          },
          "150": {
            "匹配大小": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 4
            }
          }
        }
      }
    }
  }
}
```

</details>

在队伍数量为 1、最大队伍大小为 4 的情况下， **每局最多需要 4 名玩家**.

定义多个 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#matchmaking-profiles) 用于游戏模式特定的规则和设置：

* 从至少 4 名玩家开始，以让玩家留在队列中并最大化匹配填充率，
* 限制 [匹配延迟](/zh/learn/pi-pei/matchmaker-in-depth.md#ping-optimization) 以防止匹配到远处的玩家，
* 让玩家选择特定游戏难度，以适合所有人的技能水平，
* 让玩家提供他们的地图偏好，以找到适合所有人的地图，
* 限制玩家等级差异，以要求相近的游戏进度，
* 指定回填组大小，以替换离开者且不超过服务器容量，
* 使用审核标记将低信誉玩家和作弊者与普通玩家分开，
* [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#group-up) 用于预组队，并在不超过服务器容量的情况下填满队伍，
* 通过不同的 [应用与版本](/zh/learn/bian-pai/application-and-versions.md#app-versions) 为其他配置档案分配更多 CPU 或内存。

从理想条件开始，并 [扩展限制](/zh/learn/pi-pei/matchmaker-in-depth.md#rule-expansion) 以确保快速匹配：

* 随着时间推移放宽延迟限制，以找到更多玩家，
* 提高允许的玩家等级差异，以找到更多玩家，
* 降低最小队伍大小，以要求更少的玩家并更快开始游戏，
  * 服务器可以用 AI 队友填补空位，
  * 或 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#backfill-match) 以便稍后加入玩家，
* 将最小队伍大小设为 1，以在排队 150 秒后单人启动游戏。

## 🎈 社交游戏

社交游戏侧重于通过协作、沟通和共享体验，在玩家之间建立联系和关系。支持大量玩家，最大化匹配填充率，并协调玩家偏好和玩法习惯。替换离开的玩家，并确保高 [Ping 信标](/zh/learn/bian-pai/ping-beacons.md#connection-quality) 以提供响应迅速的玩家体验。

<details>

<summary>🎈 社交游戏示例</summary>

```json
{
  "版本": "3.2.5",
  "检查": true,
  "最大部署重试次数": 3,
  "配置文件": {
    "社交示例": {
      "票证过期时长": "3m",
      "票证移除时长": "1m",
      "组不活跃移除时长": "5m",
      "应用": {
        "名称": "my-game-server",
        "版本": "2024.01.30-16.23.00-UTC"
      },
      "规则": {
        "初始": {
          "匹配大小": {
            "属性": {
              "队伍数量": 1,
              "最小队伍大小": 50,
              "最大队伍大小": 50
            },
            "类型": "玩家数量"
          },
          "信标": {
            "属性": {
              "差值": 125,
              "最大延迟": 150
            },
            "类型": "延迟"
          },
          "所选模式": {
            "类型": "交集",
            "属性": {
              "重叠": 1
            }
          },
          "回填组大小": {
            "类型": "交集",
            "属性": {
              "重叠": 1
            }
          },
          "审核标志": {
            "类型": "交集",
            "属性": {
              "重叠": 1
            }
          }
        },
        "扩展": {
          "15": {
            "信标": {
              "差值": 125,
              "最大延迟": 250
            },
            "匹配大小": {
              "队伍数量": 1,
              "最小队伍大小": 20,
              "最大队伍大小": 50
            }
          },
          "30": {
            "匹配大小": {
              "队伍数量": 1,
              "最小队伍大小": 10,
              "最大队伍大小": 50
            }
          },
          "150": {
            "匹配大小": {
              "队伍数量": 1,
              "最小队伍大小": 1,
              "最大队伍大小": 50
            }
          }
        }
      }
    }
  }
}
```

</details>

在队伍数量为 1（自由对战）且最大队伍大小为 50 的情况下， **每局最多需要 50 名玩家**.

定义 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#matchmaking-profiles) 用于游戏模式特定的规则和设置：

* 限制 [匹配延迟](/zh/learn/pi-pei/matchmaker-in-depth.md#ping-optimization) 以防止匹配到远处的玩家，
* 让玩家提供他们的游戏模式偏好，并找到适合所有人的模式，
* 指定回填组大小，以替换离开者且不超过服务器容量，
* 使用审核标记将低信誉玩家和作弊者与普通玩家分开，
* [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#group-up) 用于预先组好的大厅或在不超过服务器容量的情况下填满队伍，
* 通过不同的 [应用与版本](/zh/learn/bian-pai/application-and-versions.md#app-versions) 为其他配置档案分配更多 CPU 或内存。

从理想条件开始，并 [扩展限制](/zh/learn/pi-pei/matchmaker-in-depth.md#rule-expansion) 以确保快速匹配：

* 随着时间推移放宽延迟限制，以找到更多玩家，
* 随着时间逐步降低最小队伍大小，以要求更少的玩家并更快开始游戏，
  * 服务器可以用 AI 玩家填补空位，
  * 或 [深入了解](/zh/learn/pi-pei/matchmaker-in-depth.md#backfill-match) 以便稍后加入玩家，
* 将最小队伍大小设为 1，以在排队 150 秒后单人启动游戏。

[^1]: 替换为你自己的应用名称

[^2]: 替换为你自己的应用版本

[^3]: 超过最大差值

[^4]: 超过最大延迟

[^5]: 完全限定域名

[^6]: 例如，3 个空位 = \["3", "2", "1"]

[^7]: 将“2”替换为实际组成员数量
