部署

了解部署及其生命周期——概念与最佳实践以便更深入理解。

🗺️ 编排

通过我们的云原生边缘计算方法,在几秒钟内启动新服务器以满足容量需求。我们将服务器视为 群羊而非宠物 ——完全替换故障实例,而不是逐个手动修理。

你的编排选择将 影响你的运维成本、服务器成本和可扩展性.

要全面了解所有优缺点,让我们比较各种编排方法。

基于对局的编排

为现代工作室提供的黄金标准,提供 最简单的集成与最高的成本效率.

👍 优点

  • 最佳成本效率——按分钟实时扩展以满足玩家需求。

  • 最低的运维成本,由于无地域托管,Edgegap 自动化处理 99% 的任务。

  • 最低延迟,因为 Edgegap 的公共云基础设施拥有 615+ 个站点。

  • 在突发流量激增时具有最快的扩容速度(突发能力)。

  • 最高标准的安全性与作弊防护(服务器权威)。

  • 意外服务器崩溃对玩家的影响最小,仅影响单场比赛。

👎 缺点

  • 采用新的编排思维模型在初期需要一定的学习成本。

  • 运行超过 24 小时的服务器将被自动终止。

🧩 最适合

  • 对延迟敏感的游戏—— 当网络代码优化无法克服高延迟时:

    • 第一人称射击、格斗游戏、VR 与 XR(虚拟与扩展现实)等,…

  • 具有 对对局时长有上限设计的游戏,

    • 大逃杀, PvPvE,合作射击、MOBA、体育类游戏、ARPG 与地牢爬行者等,…

🔎 可发现性

Edgegap 会根据每个区域的玩家活动自动上下扩展所有 615+ 个服务器位置。为成功做准备——无缝地 在 60 分钟内扩展到 1400 万并发用户.

区域待命

传统模型适用于 具有用户生成内容的持久世界和社交类 MMO 游戏.

👍 优点

  • 熟悉且易于理解,是经验丰富的老手常用的老派方法。

  • 最高标准的安全性与作弊防护(服务器权威)。

  • 基于月度承诺的成本易于预测。

👎 缺点

  • 更高的托管成本——每个区域需要一个或多个空闲待命服务器(突发容量)。

  • 更高的运维成本——每个区域都需要重复进行扩展、运营和维护。

  • 玩家较少的区域会因加入远程服务器而出现较高延迟。

🧩 最适合

  • 服务器上保存用户生成内容的持久世界,即使玩家离线内容仍在服务器上存储。

    • MMO、带基地建造或物体摆放的沙盒、提取类射击游戏等,…

  • 对延迟容忍的游戏—— 当不需要服务器权威的实时物理时:

    • 移动游戏、合作游戏、TCG/CCG、回合制策略等,…

  • 异步多人游戏, 服务器崩溃对玩家体验影响最小的情况:

    • 与幽灵竞速、掠夺敌方基地、基于计时的建造/耕作游戏等,…

  • 初始化过程开销大的应用——当准备服务器需要数分钟时。

🔎 可发现性

参见 托管集群 用于 在 Edgegap 上自托管你的微服务和后端服务

点对点(Peer to Peer)

将开发精力从 专用服务器 转移到 面向非竞技类游戏的中继网络代码.

相关主题:监听服务器、玩家主机权威、NAT 穿透。

👍 优点

  • 最低的托管成本,仅需中继服务器来解决 NAT 穿透问题。

  • 最低的运维成本——只需维护客户端构建和分发渠道。

  • 意外服务器崩溃对玩家的影响最小,仅影响单场比赛。

  • 易于实现且原型开发时间短,不需要任何后端开发。

👎 缺点

  • 需要增加点对点网络代码开发工作量,需掌握并发编程技能。

  • 最差的延迟体验,对不利网络条件(例如移动网络)最为敏感。

  • 安全性最弱,易受中间人攻击和会话劫持的威胁。

  • 当主机离开时可能导致会话中断,除非你实现自定义的主机迁移。

🧩 最适合

  • 合作与休闲类游戏—— 当作弊不会影响乐趣或破坏游戏时,

    • 儿童游戏、探索类游戏、冒险类游戏等,…

🔎 可发现性

📍 服务器部署位置

无论选择哪种编排方法,为一组玩家选择合适的服务器位置对确保最佳延迟和最优玩家体验至关重要。了解不同的服务器部署策略,以及它们如何影响你的玩家。

你的服务器部署策略将 影响玩家体验、留存率和你的游戏评价.

参见 部署 转移到 实时分析服务器部署,在大规模下。

服务器评分

服务器评分策略使用 Edgegap 的专利方法, 针对每场匹配单独优化服务器部署位置。执行非侵入性遥测以估算每位玩家到我们服务器位置的网络接近度,并选择能提供最佳:

  • 响应性 ——为所有玩家平均提供最低延迟,

  • 公平性 ——为所有玩家提供平衡且公平的延迟。

无响应的部署位置 ——服务器距离过远,所有玩家延迟高:

不公平的部署位置 ——延迟不均,一位玩家处于劣势:

良好部署示例 ——为所有玩家提供响应快且公平的延迟:

该策略在 为彼此远离的一组玩家托管时尤其有效 (北美对欧洲,或西海岸对东海岸),这种情况在预制大厅中经常出现。

地理定位

或者, 提供玩家的经纬度坐标或首选服务器位置的坐标 以替代自动遥测。此方法需要额外的客户端侧地理查找实现,完全依赖游戏开发者的解决方案。

区域锁定

服务器可使用粗略泛化的区域参数进行部署,方式为:

  • 基于玩家元数据(玩家账号数据库)为玩家自动选择,或

  • 在匹配过程中由玩家选择,允许放置在具有较高客户端-服务器延迟的位置。

🟢 连接质量

有些游戏(和部分玩家)对延迟或卡顿比其他更敏感。虽然玩家报告是指示大规模事件或回归错误的良好指标, 但玩家可能对网络概念缺乏深入理解 并且容易将责任归咎于工作室、网络代码或服务器。

某些问题的根本原因可能对玩家是不可见的,因此工作室与托管提供商的合作可能至关重要。 Edgegap 的优先目标始终是提供尽可能最好的服务。

如果你收到大量玩家报告、遇到广泛的故障或反复出现的问题,请立即通过我们平台的支持工单与我们联系。

如果您需要帮助, 请通过 Discord 与我们联系。有关真人游戏支持,请参阅我们的 工单系统.

低延迟

玩家延迟由在以下各项之间传输数据的延迟组成:

  • 物理设备—— 物理信号穿过 互联网网络拓扑,

  • 主机到主机 ——由协议、传输与安全措施导致,

  • 进程到进程 ——由客户端/服务器中对数据的(打包)与处理导致。

Edgegap 通过将服务器部署得更靠近玩家来降低物理延迟,从而实现更短的响应时间和更少的网络跃点。凭借跨 17 家云与裸金属提供商的站点,你将获得 在全球任何地方为玩家提供的一流延迟.

服务器与互联网的全球覆盖(不仅仅是 Edgegap)受限于诸如以下因素:

  • 基础设施可用性 ——某一区域的互联网连接质量可能不足,

  • 自然因素 ——高度复杂的服务器机架需要相对稳定的环境。

高可用性

全球各地不同位置的服务器可用性会随时间变化,并在一天中多次变动。Edgegap 会自动 按需上下扩展 位置 ,并会考虑:突发流量

  • ——在 15 分钟内发起的部署, vCPU 要求

  • ——每次部署更多的 vCPU 会增加特定位置的总体需求, 提供商可用性

  • ——某些偏远位置可选的提供商较少, 机器可用性

  • ——某些位置可能仅提供 4 vCPU 或 8 vCPU 的机器, 工作室请求

  • 用于测试、质量保证、抢先体验、封闭测试或比赛。 所有应用的部署请求会被合并以评估位置需求。默认情况下,所有组织具有相同的分配优先级,且

对于需要特定硬件或位置的企业客户可以添加私有服务器池 .

玩家问题解决

玩家问题可能根源于服务器漏洞或提供商事件,但也可能来自第三方,例如本地 ISP、游戏服务、底层库的漏洞、基础设施提供商或其他来源。

在排查玩家报告或事件时,请考虑以下因素:

  • 匹配质量 ——玩家应彼此接近(同一区域),以便 部署 获得最佳结果:

  • 区域性问题:

    • 本地化的互联网服务提供商(ISP)可能暂时性地解决一个事件,

    • 某些地区(例如中国、俄罗斯)可能由于本地化制裁而受限,

  • 缓存级别 ——Edgegap 会优先在有缓存的位置进行快速部署:

  • 最大部署时间 ——部署可能由于缓慢且耗时的初始化过程而失败:

    • 参见 应用与版本 要增加超时时间,

    • 将初始化步骤延后到绝对必要时,

  • 服务器镜像或集成问题.

在出现广泛性错误、临时问题和故障时通知用户,以减轻负面情绪。

🔄 部署生命周期

Edgegap 的部署会经过若干生命周期阶段,由部署状态表示。

1. 启动部署

用于 测试目的 的部署可以使用以下方式启动:

  • 虚幻引擎 - 用于 Unreal Engine 项目的 Docker 扩展或插件,

  • Unity - Unity 项目的插件,

  • 仪表板 Web UI - 用于测试服务器集成的易用网页界面。

用于 生产环境(线上) 应使用以下方式启动:

在使用 部署 API进行测试时,你可以覆盖默认的 Dockerfile CMD 为自定义命令。

2. 部署中

一旦启动部署,我们的系统会快速连续执行多个步骤:

  • 遥测——我们正在测量可用数据中心到每位玩家的网络响应性,

  • 部署——我们正在保留容量并准备启动你的服务器容器,

  • 容器启动——我们正在启动容器、安装依赖并初始化,

  • 后处理——我们正在添加日志存储、监控并完成部署。

3. 部署已就绪

你的容器已完全初始化,服务器正在启动。在几秒到一分钟内,你的服务器可能仍在初始化,在游戏引擎(或自定义运行时)完全准备好接受玩家连接之前可能不会响应玩家请求。

4. 部署错误

你的部署在任何时间点可能因意外原因进入错误状态。这在测试集成或测试新服务器构建时更容易发生。

对于处于错误状态的部署你不会被收费,这些部署会在 24 小时后自动停止。

故障排查步骤:

如果您需要帮助, 请通过 Discord 与我们联系。有关真人游戏支持,请参阅我们的 工单系统.

以便我们能及时调查!

5. 部署已停止我们不会在未经你指示的情况下停止你的服务器,

  • 以避免对玩家体验造成负面影响。你的部署可能因以下原因被停止: 通过 DELETE_URL

  • 自我停止 ——玩家离开且比赛结束后部署自行停止, 由你的后端停止,

  • ——你的后端使用 部署 API 应用与版本 停止了该部署,

  • 私有舰队 游戏最大时长

——你在 中分配的时间已到期, 承载你部署的主机通过计划动作被删除。 一旦部署被停止, 我们会触发优雅终止 通过发送 SIGTERM

信号给你的主进程,允许短暂的终止期限。一旦到期,会发送

SIGKILL

可发现性

信号以停止部署。👀 可观测性允许游戏服务器与第三方互操作并获取运行时洞察。

)和每个内部端口对应的外部端口。 使用

部署标签以便轻松标记你的部署

来自你的游戏服务器的出站流量(到客户端或后端)从不被阻止

  • 或过滤。Websockets (WS) 与 安全 Websockets (WSS)

    • 要在 Edgegap 上使用基于 websocket 的网络代码,你有两种选择: 应用与版本 转移到 托管证书

    • ,1 分钟内设置完成且无需编写任何代码: 配置你的)

  • 使用 Websocket (WS) 并启用 TLS 升级,使用 Edgegap URL 连接客户端(例如:

未捕获的服务器异常会导致部署的容器重启并使 TLS 安全失效。在这种情况下,

停止你的服务器

在 C++ 中获取环境变量值的 GetEnvironmentVariable

应用版本变量

此外还有下文的部署变量。

自定义变量

  • 为每次部署定义最多 20 个自定义变量,每个变量可包含最多 4KB 的字符串数据。 避免使用下面的保留名称,否则你的自定义变量将被覆盖! 通过读取 Edgegap 注入到服务器的变量来访问重要信息: .

    • 标识符

    • ARBITRIUM_REQUEST_ID ——例如:.

  • f68e011bfb01 避免使用下面的保留名称,否则你的自定义变量将被覆盖! 唯一的部署 ID,也称为请求 ID。用于检索更多信息。 .

    • 部署 URL 始终具有格式

  • {ARBITRIUM_REQUEST_ID}.pr.edgegap.net 避免使用下面的保留名称,否则你的自定义变量将被覆盖! 162.254.141.66 .

    • ARBITRIUM_HOST_ID

  • alpha-north-america-70364ef8 避免使用下面的保留名称,否则你的自定义变量将被覆盖! 承载你部署的机器的唯一标识符,与其他部署共享。 .

ARBITRIUM_DEPLOYMENT_TAGS

  • tag1,tag2 避免使用下面的保留名称,否则你的自定义变量将被覆盖! 2000 以逗号分隔的用户定义部署标签,

  • 便于搜索与筛选 避免使用下面的保留名称,否则你的自定义变量将被覆盖! 256资源规格

  • ARBITRIUM_HOST_BASE_CLOCK_FREQUENCY 避免使用下面的保留名称,否则你的自定义变量将被覆盖! 512,处理器频率,单位 MHz。

ARBITRIUM_DEPLOYMENT_VCPU_UNITS

  • ,分配的 vCPU 单位(1024 = 1 vCPU)。 避免使用下面的保留名称,否则你的自定义变量将被覆盖! ARBITRIUM_DEPLOYMENT_MEMORY_MB.

    • ,分配的内存,单位 MB(1024 = 1 GB)。 生命周期管理.

    • ARBITRIUM_DELETE_URL https://api.edgegap.com/v1/self/stop/9f511e17/660 可从部署内调用, 部署将被优雅地停止 需要唯一的一次性

  • https://api.edgegap.com/v1/self/stop/9f511e17/660 避免使用下面的保留名称,否则你的自定义变量将被覆盖! ARBITRIUM_DELETE_TOKEN.

  • 避免使用下面的保留名称,否则你的自定义变量将被覆盖! Authorization.

    • 头中。

    • 7df4cd933df87084b34ae80d8abde293 ARBITRIUM_CONTEXT_URL 可从部署内调用, 部署将被优雅地停止 需要唯一的一次性

  • ARBITRIUM_CONTEXT_URL 避免使用下面的保留名称,否则你的自定义变量将被覆盖! https://api.edgegap.com/v1/context/9170f5211e17/17.

可发现性

  • 仅可从部署内调用,返回更多部署详情。 避免使用下面的保留名称,否则你的自定义变量将被覆盖! 7777 需要唯一的

  • ARBITRIUM_CONTEXT_TOKEN 避免使用下面的保留名称,否则你的自定义变量将被覆盖! 31504 dfaf50b9333b9ee07b22ed247e4a17e6

    • ARBITRIUM_PORT_GAMEPORT_INTERNAL

  • ,服务器监听的内部端口。 避免使用下面的保留名称,否则你的自定义变量将被覆盖! ARBITRIUM_PORT_GAMEPORT_EXTERNAL ,客户端连接的外部端口。

  • 变量: 避免使用下面的保留名称,否则你的自定义变量将被覆盖! @Super Port!Ping 信标.

  • ARBITRIUM_PORT_SUPER_PORT_INTERNAL 避免使用下面的保留名称,否则你的自定义变量将被覆盖! 139.177.198.69 ARBITRIUM_BEACON_ENABLED

  • true 避免使用下面的保留名称,否则你的自定义变量将被覆盖! 30199,如果部署在运行

  • 的私有舰队上。 避免使用下面的保留名称,否则你的自定义变量将被覆盖! 30456ARBITRIUM_HOST_BEACON_PUBLIC_IP

,最近的 beacon 的公网 IP。

ARBITRIUM_HOST_BEACON_PORT_UDP_EXTERNAL ,用于通过 UDP 测量延迟。ARBITRIUM_HOST_BEACON_PORT_TCP_EXTERNAL

,用于通过 TCP 测量延迟。结构化信息(作为字符串的 JSON)
"continent": "北美洲","administrative_division": "魁北克",

仪表板监控

我们的 仪表板 提供用于监控服务器可扩展性并协助运维的实用工具。

分析

🌟 升级到按需付费等级 以解锁详细的服务器性能指标和洞察:

  • 常规洞察: 监控每个版本的实时服务器数量及资源使用概览,

  • CPU 洞察:排查因处理器密集型操作导致的服务器卡顿,

  • 内存洞察:缓解因超出分配内存导致的服务器重启,

  • 网络洞察: 检测低效的网络模式并优化网络代码。

部署地图

在地图上预览部署位置、可用位置和估计的玩家位置:

部署平衡点

预览部署平衡点热力图并按以下条件过滤 应用与版本。平衡点是对给定部署中各玩家具有相等网络接近性的近似位置:

部署日志

部署日志显示有关以下内容的信息 部署:

容器日志

在出现问题或调试时检查您的游戏服务器日志:

容器指标

查看容器指标(处理器、内存、网络)以:

  • 在出现连接问题时识别常见问题, 部署,

  • 检测导致资源使用激增的低效实现模式,

  • 找出特定场景下的低效资源使用,

  • 验证在优化期间服务器资源使用的变化,

  • 基准测试服务器初始化的资源消耗和持续时间。

历史指标以 1 分钟时间周期显示平均值,可在免费层使用。

🌟 升级到按需付费等级 以解锁具有 1 秒时间间隔的精确指标。

联系我们 在发布之前请求大规模发布的实时托管支持。

上下文与状态

可以以 JSON 格式检索其他部署信息:

上下文 API(来自部署)需要 Context API 令牌,而状态 API 使用您的 Edgegap 令牌。

筛选部署

要在所有部署中快速搜索,您可以 使用我们的仪表板:

列出具有 API 的部署 并通过后端集成应用过滤:

部署属性
运算符
示例值

eq 注入变量 neq

"ready" 注入变量 "error"

eq

"7e709a0d8efd"

可从部署内调用, 注入变量 nin

[ "7e709a0d8efd", "4ba353100b4b" ]

eq 注入变量 neq

"tagA"

可从部署内调用, 注入变量 nin

[ "tagA", "tagB" ]

eq 注入变量 lte 注入变量 gte

eq 注入变量 neq

"my-app"

可从部署内调用, 注入变量 nin

[ "my-app", "my-other-app" ]

eq 注入变量 neq

"1.0.0"

可从部署内调用, 注入变量 nin

[ "1.0.0", "prod" ]

eq

@Super Port! 注入变量 false

eq 注入变量 neq 注入变量

lt 注入变量 lte 注入变量

gt 注入变量 gte

5

每个属性在单个请求中最多可以有 1 个过滤运算符。参见 API 参考 以了解更多信息。

按请求中出现的顺序按多个字段排序结果:

部署属性
顺序

asc 注入变量 desc

asc 注入变量 desc

示例过滤查询:

列出 错误中的部署 以进行故障排除和移除。

编码后的 URL:

格式化的 JSON 查询:

列出 应用版本过时的部署 以确认发布已完成。

编码后的 URL:

格式化的 JSON 查询:

列出 具有可用会话插槽容量的部署 可用于加入。

编码后的 URL:

格式化的 JSON 查询:

Webhook 与回调

如果您需要在部署变为 Ready 或出现错误时接收简单的 HTTP 通知,您可以指定一个 webhook URL 在您的 部署 API 请求中.

对于可靠的部署监听器,实现带抖动的指数重试或轮询 部署状态 API.

🚨 故障排除

在排查部署问题时:

  1. 确认您的 部署部署,

  2. 中没有错误

  3. 在本地运行您的服务器以排除集成错误,

  4. 在本页查看故障排除步骤, 联系社区 社区 Discord

参见 部署 并包含您的部署 ID。

以获取我们关于处理玩家社区反馈的建议。 无法将客户端连接到服务器 -, 请求超时。 , 请求超时 ConnectionFailed ,或.
吗?您的连接可能会被防火长城拦截。请考虑在您的舰队中添加位于中国的服务器,或使用 VPN 进行连接。
以发现导致部署停止的所有原因。
  • 我的部署在 X 分钟后自动停止。

  • 免费层部署有 60 分钟的时间限制,请考虑升级您的账户。 您位于中国并正在使用.

  • 参见 部署 集成第三方日志存储

根据我们的服务器清理策略,所有部署在运行 24 小时后将被终止,用于基础设施维护并防止在部署未正确关闭时产生意外费用。对于长期运行的服务器,请考虑使用
  • 我的部署已就绪,但在随后的几分钟内无法连接。

  • 部署就绪后,您的游戏引擎初始化开始。此过程可能需要几秒到几分钟不等,在此期间服务器不会接受玩家连接。

  • 请考虑优化服务器初始化以缩短此时间。

  • 游戏客户端应以 1 秒间隔重试连接一段有限时间(取决于您的初始化时长),之后返回匹配服务。

考虑添加加载场景,以便服务器可以在客户端执行初始化(以及在使用 Unreal Engine 时进行 travel)时同步双方状态。 我的 Meta Quest 设备抛出 .
  • HTTP 0:无法解析目标主机

  • 当为 Android 目标构建 Unity 应用时,您的 Internet 访问权限可能会在输出的 APK 客户端构建产物中被自动移除。

    • 重新在以下位置添加权限(之后需要重新构建客户端): ⚙️ 项目设置 / OpenXR /

    • Meta Quest 支持 / 强制移除 Internet 权限(取消勾选)。

玩家设置 / Internet 访问(设置为需要)。
  • 如果玩家离开我的部署,会发生什么?

  • 默认情况下,服务器不会拒绝玩家连接。对玩家进行身份验证由您的开发人员负责,因为可以使用多种不同的方法和玩家身份验证提供商。

  • 游戏客户端可能会本地存储连接信息,以在客户端意外崩溃时尝试重新连接。 深入解析 注入变量 要允许玩家加入正在进行的游戏,请考虑使用.

会话
  • 我的服务器在就绪后显示 100% 的 CPU 利用率。

  • 这可能并非问题,因为游戏引擎在服务器初始化期间往往会执行大量 CPU 密集型操作。如果部署启动后 2-3 分钟内 CPU 使用率未下降,您可能需要优化服务器或增加应用版本资源。

  • 首先,确保部署为 Ready,且部署日志中没有运行时异常或错误。如果部署已停止,请在我们的 中检查日志 如果您使用 Mirror 网络代码,您需要在 中选择 “自动启动服务器”

  • ,重建、推送并重新部署您的服务器。 如果您使用 FishNet 网络代码,您需要启用 在您的 “在无头模式下启动”“自动启动服务器”

  • 降低 tick 率会影响 CPU 使用,因为服务器执行的消息操作减少。

  • 在免费层中,您被限制为 1.5 vCPU 和 3GB 内存(RAM)。

您可以在创建新应用版本时增加分配的资源。您可以在我们的仪表板中复制您的应用版本并根据需要调整这些值,而无需重新构建服务器或镜像。
  • 我的部署不断重启并显示错误 `OOM kill` 。

  • 此行为是由超出分配内存量引起的。请考虑通过对象池、压缩或移除场景中不需要的对象来优化内存使用。 中选择 确保您的项目正在加载包含您的

  • 降低 tick 率会影响 CPU 使用,因为服务器执行的消息操作减少。

  • 在免费层中,您被限制为 1.5 vCPU 和 3GB 内存(RAM)。

的默认场景,并且该场景已包含在 Unity 的构建设置中。
  • 有时,我的服务器内存(RAM)使用会飙升到很高的值,这是个问题吗?

  • 只要您在分配的应用版本内存量内,这不是问题。

超出分配的应用版本内存量将导致 `OOM kill`(见上文)。
  • 在同一台机器上运行的其他服务器会影响我的服务器性能吗?

最后更新于

这有帮助吗?