bolt部署

了解部署及其生命周期——用于深入理解的概念和最佳实践。

🗺️ 编排

在数秒内启动新服务器,以满足容量需求,采用我们的云原生边缘计算方案。我们将服务器视为 牲畜而不是宠物arrow-up-right ——直接替换故障实例,而不是手动逐个维护。

circle-info

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

circle-check

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

匹配绑定

现代工作室的黄金标准,提供 最易集成且成本效率最佳.

👍 优点

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

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

  • 由于 Edgegap 公有云基础设施中有 615+ 个站点,Ping 最低。

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

  • 最高标准的安全性和防玩家作弊能力(服务器权威)。

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

👎 缺点

  • 采用新的编排思维模型,初期需要一些上手成本。

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

🧩 最适合

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

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

  • 设计上具有 对单场比赛时长的上限,

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

🔎 可发现性

circle-info

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

区域待机

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

👍 优点

  • 熟悉且易于理解,是久经沙场老手的老派做法。

  • 最高标准的安全性和防玩家作弊能力(服务器权威)。

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

👎 缺点

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

  • 更高的 DevOps 成本——每个区域都要重复扩缩、运维和维护。

  • 玩家基数较小的区域由于连接到远方服务器而经历较高的 ping。

🧩 最适合

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

    • MMO、带基地建设或物品放置的沙盒、撤离射击游戏等……

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

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

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

    • 与鬼影竞速、掠夺敌方基地、基于计时器的建造/农场游戏等……

  • 启动过程较重的应用——当准备服务器需要几分钟时。

🔎 可发现性

circle-info

查看 托管集群 关于 在 Edgegap 上自托管你的微服务和后端服务

点对点

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

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

👍 优点

  • 最低托管成本,只需要中继服务器来解决 NAT 穿透。

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

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

  • 易于实现,原型开发速度快,无需任何后端开发。

👎 缺点

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

  • Ping 最差,并且对不利网络条件(例如移动网络)最敏感。

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

  • 如果你不实现自定义主机迁移,主机离开时可能导致会话丢失。

🧩 最适合

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

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

🔎 可发现性

circle-check

📍 服务器放置

无论你选择哪种编排方式,为一组玩家选择正确的服务器位置对于确保尽可能好的 ping 和最佳玩家体验都至关重要。了解不同的服务器放置策略,以及它们如何影响你的玩家。

circle-info

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

circle-check
circle-info

查看 部署 转向 实时分析服务器放置,并在大规模场景下进行。

服务器评分

服务器评分策略使用 Edgegap 的专利方法, 为每场对局单独优化服务器放置。它执行非侵入式遥测来近似每个玩家与我们服务器位置之间的网络距离,并选择能提供最佳效果的服务器:

  • 响应性 - 平均为所有玩家提供最低 ping,

  • 公平性 - 为所有玩家提供均衡且公平的 ping。

circle-check

响应差的放置 - 服务器很远,所有玩家的 ping 都很高:

不公平的放置 - ping 不均衡,某个玩家处于劣势:

良好放置示例 - 所有玩家的 ping 响应迅速且公平:

circle-info

此策略 尤其适合在彼此相距很远的玩家之间托管一组玩家 (北美 vs. 欧洲,或西海岸 vs. 东海岸),这在预组大厅中很常见。

地理定位

或者, 提供玩家的纬度和经度坐标,或首选服务器位置的坐标 ,而不是利用自动遥测。这种方法需要额外的客户端地理查询实现,完全依赖游戏开发者的方案。

circle-exclamation
circle-check

区域锁定

服务器可使用一个粗略概括的区域参数进行放置,方式可以是:

  • 根据玩家元数据(玩家账户数据库)自动为玩家选择,或者

  • 由玩家在匹配时选择,从而允许以较高的客户端-服务器延迟进行放置。

triangle-exclamation
circle-check

🟢 连接质量

有些游戏(以及某些玩家)比其他游戏更容易受延迟或卡顿影响。虽然玩家报告是大规模事件或回归漏洞的绝佳指标, 但玩家可能并不深刻理解网络概念 并且很快会将责任归咎于工作室、网络代码或服务器。

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

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

低延迟

玩家延迟是以下之间传输数据所产生的延迟总和:

  • 物理设备—— 物理信号跨越 互联网网络拓扑arrow-up-right,

  • 主机到主机 ——由协议、传输和安全措施产生,

  • 进程到进程 ——由客户端/服务器中的数据打包(或解包)和处理产生。

Edgegap 通过将服务器放置在更靠近玩家的位置来减少物理延迟,从而获得更短的响应和更少的网络跳数。凭借遍布 17 家云和裸金属提供商的站点,你将获得 全球任何地方玩家的同类最佳 ping.

由于以下因素,全球服务器和互联网覆盖(不只是 Edgegap)都有限:

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

  • 自然因素 - 高度复杂的服务器机架大多需要稳定的环境。

高可用性

世界各地不同位置的服务器可用性会随时间变化,一天中会多次变更。Edgegap 会自动 上下扩展 位置 按需,考虑:

  • 突发流量 - 在 15 分钟内完成的部署,

  • vCPU 需求 - 每次部署所需的 vCPU 更多,会增加特定位置的总体需求,

  • 提供商供给 - 一些偏远位置可用的提供商选项更少,

  • 机器可用性 - 某些位置可能只提供 4 vCPU 或 8 vCPU 的机器,

  • 工作室请求 用于测试、质量保证、抢先体验、封闭测试或锦标赛。

所有应用的部署请求都会合并以评估位置需求。默认情况下,所有组织具有相同的分配优先级,且 可为需要特定硬件或位置的企业客户添加私有服务器池.

circle-check

玩家问题解决

玩家问题可能源于服务器错误或提供商事故,也可能来自本地 ISP、游戏服务、底层库中的错误、基础设施提供商或其他来源等第三方。

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

  • 匹配质量 - 玩家彼此之间应尽量接近(同一地区)以便 部署 取得最佳结果:

  • 区域性问题:

    • 本地互联网服务提供商(ISP)可能正在短暂处理事故,

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

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

  • 最大部署时间 - 由于初始化过程缓慢且繁重,部署可能失败:

    • 查看 应用和版本 要增加超时期限,

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

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

circle-check
circle-info

向用户通知广泛存在的漏洞、临时问题和故障,以减轻负面情绪。

🔄 部署生命周期

Edgegap 部署会经历多个生命周期阶段,由部署状态表示。

1. 启动部署

一个用于 测试目的 的部署可以通过以下方式启动:

一个用于 线上生产环境 应通过以下方式启动:

circle-check
circle-info

在使用 部署 APIarrow-up-right测试时,你可以覆盖默认的 Dockerfile CMD 并使用自定义命令。

2. 部署中

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

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

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

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

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

circle-exclamation

3. 部署就绪

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

circle-check

4. 部署错误

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

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

故障排查步骤:

circle-check

5. 部署已停止

我们绝不会在没有你指示的情况下停止你的服务器,以避免对玩家体验造成负面影响。你的部署可能因以下原因被停止:

circle-info

一旦部署停止, 我们会触发优雅终止 ,通过向你的主进程发送 SIGTERM 信号,允许短暂的终止期。期满后,会发送 SIGKILL 信号以停止部署。

👀 可观测性

允许游戏服务器与第三方互操作并获得运维洞察。

可发现性

一旦就绪,部署会被分配一个 URL(fqdnarrow-up-right)以及每个内部端口对应的外部端口。

circle-check
circle-info

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

WebSocket(WS)与安全 WebSocket(WSS)

要在 Edgegap 中使用基于 websocket 的网络代码,你有两个选择:

  • 托管证书,1 分钟内即可设置完成,无需编写任何代码:

    • 配置你的 应用和版本 转向 使用 WebSocket(WS)并启用 TLS 升级,

    • 使用 Edgegap URL 连接客户端(例如 https://5fa53fa00a57.pr.edgegap.net/)

  • 自托管证书,如果你想使用自己的自定义域名:

triangle-exclamation

注入变量

游戏服务器通常需要额外信息,例如服务器 IP、内部端口值等。注入只读环境变量是一种可靠且与云无关的参数传递方式。

circle-info

查看 应用版本变量匹配器变量 以及下面的部署变量。

自定义变量

为每个部署定义最多 20 个自定义变量,每个变量最多包含 4KB 的字符串数据。

circle-exclamation

通过读取 Edgegap 注入到你服务器中的变量来访问重要信息:

标识符

  • ARBITRIUM_REQUEST_ID - 例如 f68e011bfb01 .

    • 唯一部署 ID,也称为请求 ID。用于检索更多信息。

    • 部署 URL 始终采用以下格式 {ARBITRIUM_REQUEST_ID}.pr.edgegap.net.

  • ARBITRIUM_PUBLIC_IP - 例如 162.254.141.66 .

    • 此主机的公网 IP 地址,可用于连接而不是使用 URL。

  • ARBITRIUM_HOST_ID - 例如 alpha-north-america-70364ef8 .

    • 托管你部署的机器的唯一标识符,会与其他部署共享。

  • ARBITRIUM_DEPLOYMENT_TAGS - 例如 tag1,tag2 .

  • ARBITRIUM_PRIVATE_FLEET_ID - 例如 PUBLIC_CLOUD ,或在以下环境中托管时的舰队 ID: 私有舰队.

资源规格

  • ARBITRIUM_HOST_IN_PRIVATE_FLEET - 例如 false ,指示是否托管于 私有舰队.

  • ARBITRIUM_HOST_BASE_CLOCK_FREQUENCY - 例如 2000 ,处理器频率,单位为 MHz。

  • ARBITRIUM_DEPLOYMENT_VCPU_UNITS - 例如 256,分配的 vCPU 单元(1024 = 1 vCPU)。

  • ARBITRIUM_DEPLOYMENT_MEMORY_MB - 例如 512,分配的内存,单位为 MB(1024 = 1 GB)。

生命周期管理

  • ARBITRIUM_DELETE_URL - 例如 https://api.edgegap.com/v1/self/stop/9f511e17/660.

    • 可由部署调用, 部署将被优雅停止.

    • 需要唯一的一次性 ARBITRIUM_DELETE_TOKENAuthorization 请求头中。

  • ARBITRIUM_DELETE_TOKEN - 例如 7df4cd933df87084b34ae80d8abde293.

  • ARBITRIUM_CONTEXT_URL - 例如 https://api.edgegap.com/v1/context/9170f5211e17/17.

    • 只能由部署调用,返回更多部署详情。

    • 需要唯一的 ARBITRIUM_CONTEXT_TOKENAuthorization 请求头中。

  • ARBITRIUM_CONTEXT_TOKEN - 例如 dfaf50b9333b9ee07b22ed247e4a17e6.

可发现性

  • ARBITRIUM_PORT_GAMEPORT_INTERNAL - 例如 7777 ,服务器监听器的内部端口。

  • ARBITRIUM_PORT_GAMEPORT_EXTERNAL - 例如 31504 ,客户端连接的外部端口。

    • 出于安全原因,每个部署的外部端口值都是随机生成的。

  • ARBITRIUM_PORT_GAMEPORT_PROTOCOL - 例如 UDP ,你的网络代码传输协议。

circle-check
  • ARBITRIUM_BEACON_ENABLED - 例如 true,如果部署在 私有舰队 上并使用 Ping 信标.

  • ARBITRIUM_HOST_BEACON_PUBLIC_IP - 例如 139.177.198.69 ,最近信标的公网 IP。

  • ARBITRIUM_HOST_BEACON_PORT_UDP_EXTERNAL - 例如 30199,用于通过 UDP 测量 ping。

  • ARBITRIUM_HOST_BEACON_PORT_TCP_EXTERNAL - 例如 30456,用于通过 TCP 测量 ping。

结构化信息(字符串形式的 JSON)

circle-info

环境变量 以字符串化 JSON 存储,请使用 SDK 或自定义方法进行解析。

chevron-rightARBITRIUM_DEPLOYMENT_LOCATION: - 关于部署位置的详细信息。hashtag
chevron-rightARBITRIUM_PORTS_MAPPING: - 有关你的内部和外部端口的详细信息。hashtag

仪表板监控

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

分析

circle-check

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

  • 通用洞察: 监控版本发布,显示每个版本的实时服务器数量 + 资源使用概览,

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

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

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

部署地图

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

部署平衡点

预览部署平衡点热力图,并按 应用和版本进行筛选。平衡点是与给定部署中的每位玩家具有相同网络接近度的大致位置:

circle-exclamation

部署日志

部署日志显示有关 部署:

容器日志

如遇问题,或在调试时检查你的游戏服务器日志:

circle-exclamation

容器指标

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

  • 识别常见连接问题,当 部署,

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

  • 在特定场景下定位低效的资源使用,

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

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

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

🌟 升级到按需付费层级arrow-up-right 以解锁 1 秒时间间隔的精确指标。

circle-info

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

上下文与状态

可通过 JSON 格式检索额外的部署信息:

circle-info

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

circle-exclamation

筛选部署

为了快速搜索所有部署,你可以 使用我们的仪表板arrow-up-right:

使用 API 列出部署arrow-up-right 并通过后端集成应用筛选条件:

部署属性
运算符
示例值

eqneq

"ready""error"

eq

"7e709a0d8efd"

nin

[ "7e709a0d8efd", "4ba353100b4b" ]

eqneq

"tagA"

nin

[ "tagA", "tagB" ]

eqneq

"my-app"

nin

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

eqneq

"1.0.0"

nin

[ "1.0.0", "prod" ]

eqneq

"my-app-fleet-europe"

nin

[ "fleet-eu", "fleet-us" ]

ilike

"%-eu%"

eqneq

"alpha-north-america-95fab093"

nin

[ "alpha-north-america-95fab093" ]

ilike

"%north-america%"

circle-info

每个属性在单个请求中最多只能有 1 个筛选运算符。更多信息请参见 API 参考

按多个字段排序,顺序与它们在请求中出现的顺序一致:

部署属性
顺序

ascdesc

available_session_sockets

ascdesc

示例筛选查询:

chevron-right列出 错误状态的部署 以进行排查和移除。hashtag

编码后的 URL:

格式化后的 JSON 查询:

chevron-right列出 具有过期 App 版本的部署 以确认发布已完成。hashtag

编码后的 URL:

格式化后的 JSON 查询:

circle-check

Webhook 与回传

通过在你的 部署 中指定 webhook URL,接收游戏后端中关于 部署 API 请求变更的简单 HTTP 通知。适用于:

  • 就绪时:部署容器 已成功启动 (服务器随后开始初始化),

  • 错误时:部署无法启动,并且发生了 部署 错误,

  • 终止时: 部署 且游戏服务器不再可达。

就绪和错误 webhook 永远不会针对同一部署同时触发。

chevron-rightWebhook 示例负载hashtag
circle-exclamation
circle-info

Webhook 会监控部署生命周期,但不了解你的场景/关卡初始化状态。若要监控场景/关卡的加载进度,请在游戏服务器中实现自定义 webhook。

🚨 故障排除

在排查部署问题时:

  1. 确认你的 部署部署,

  2. 中没有错误,并在本地运行服务器以排除集成 bug,

  3. 查看本页上的故障排除步骤,

  4. 通过 社区 Discordarrow-up-right 联系我们,并附上你的部署 ID。

circle-info

查看 部署 了解我们关于如何处理玩家社区反馈的建议。

chevron-right无法将客户端连接到服务器 - 请求超时。, 请求超时 , ConnectionFailed ,或 端口验证失败.hashtag
chevron-right我的部署已停止/重启,我再也无法访问它的日志了。hashtag
  • 如果服务器进程因异常而崩溃,我们的系统会尝试自动重启服务器。建议你先在本地测试服务器,以找出根本原因。

  • 我们只在部署期间保留日志,如果你希望在部署停止后查看日志,请 集成第三方日志存储arrow-up-right.

  • 查看 部署 以发现导致部署停止的所有原因。

chevron-right我的部署在 X 分钟后自动停止了。hashtag
  • 免费层部署有 60 分钟的时间限制,请考虑升级你的账户。

  • 根据我们的服务器清理策略、出于基础设施维护考虑,以及防止在部署未正确关闭时产生意外费用,所有部署将在运行 24 小时后终止。对于长时间运行的服务器,请考虑使用 私有舰队 上并使用 持久化.

  • 查看 部署 以发现导致部署停止的所有原因。

chevron-right我的部署已就绪,但之后几分钟我仍无法连接。hashtag
  • 一旦部署就绪,你的游戏引擎初始化就会开始。此过程可能持续数秒到数分钟,在此期间服务器不接受玩家连接。

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

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

  • 建议添加一个加载场景,这样服务器就能在与客户端同步状态的同时进行初始化(在虚幻引擎中还可执行 travel)。

chevron-right我的 Meta Quest 设备报错 HTTP 0: 无法解析目标主机 .hashtag
  • 当为 Android 目标构建 Unity 应用时,你的 Internet Access 权限可能会在输出的 APK 客户端构建产物中被自动移除。

  • 重新添加这些权限(之后需要重新构建客户端):

    • 项目设置 / OpenXR / ⚙️ Meta Quest Support / Force Remove Internet Permissions(取消勾选)。

    • Player Settings / Internet Access(设置为 require)。

chevron-right如果有玩家离开我的部署,会发生什么?hashtag
  • 默认情况下,服务器不会拒绝玩家连接。玩家认证由你的开发者负责,因为可以使用许多不同的方法和玩家认证提供商。

  • 游戏客户端可能会在本地存储连接信息,以便在客户端意外崩溃时尝试重新连接。

  • 为了允许玩家加入正在进行中的游戏,请考虑使用 深入了解会话arrow-up-right.

chevron-right我的服务器在就绪后显示 100% CPU 使用率。hashtag
  • 这可能不是问题,因为游戏引擎通常会在服务器初始化期间执行 CPU 密集型操作。如果在部署开始后 2-3 分钟内 CPU 使用率没有下降,你可能需要优化服务器或增加应用版本资源。

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

  • 如果你使用的是 Mirror 网络代码,则需要启用 “Auto Start Server”arrow-up-right 在你的 NetworkManager 中选中,然后重新构建、推送并重新部署你的服务器。

  • 如果你使用的是 FishNet 网络代码,则需要启用 “Start on Headless”arrow-up-right 在你的 ServerManager中选中,然后重新构建、推送并重新部署你的服务器。

  • 免费层限制为 1.5 vCPU 和 3GB 内存(RAM)。

  • 你可以在创建新的 App 版本时增加分配的资源。你可以在我们的仪表板中复制你的 App 版本,并根据需要调整这些值,而无需重新构建服务器或镜像。

chevron-right我的部署不断重启,并显示错误 `OOM kill`。hashtag
  • 这种行为是由于超出分配的内存量造成的。建议使用对象池、压缩,或移除场景中不需要的对象来优化内存使用。

  • 请确保你的项目加载了包含你的默认场景 NetworkManager ,并且该场景已包含在 Unity 的构建设置中。

  • 免费层限制为 1.5 vCPU 和 3GB 内存(RAM)。

  • 你可以在创建新的 App 版本时增加分配的资源。你可以在我们的仪表板中复制你的 App 版本,并根据需要调整这些值,而无需重新构建服务器或镜像。

chevron-right有时,我服务器的内存(RAM)使用会突然飙升到很高的值,这会有问题吗?hashtag
  • 只要你不超过分配的 App 版本内存量,这就不是问题。

  • 超出分配的 App 版本内存量会导致 `OOM kill`(见上文)。

chevron-right我的服务器性能会受到同一台机器上运行的其他服务器影响吗?hashtag
  • 不会,我们的平台确保分配的资源不会被其他工作室或共享基础设施上的其他服务器使用。使用 Edgegap,不存在“吵闹邻居”问题。

最后更新于

这有帮助吗?