阿里云 API 网关 x OKG:游戏连接治理的「最后一公里」

游戏连接治理的最后一公里

游戏有状态的属性决定了玩家的连接需要精细化处理。在传统端游场景,游戏往往通过业务网关维护四层协议连接,或者为低延迟游戏提供独立访问地址以实现客户端直连。

随着小程序与 H5 游戏的普及,基于七层协议的网络游戏面临双重挑战:一方面需要控制开发运维成本,另一方面必须满足创意验证对快速版本迭代的要求。这种矛盾催生了对高效弹性架构的迫切需求------通过云原生转型实现资源利用效率优化与游戏发布流程革新。

在七层网络场景下,玩家状态管理与连接治理形成深度耦合。玩家连接/退出事件与服务实例的动态伸缩之间存在精密平衡关系,特别是在自动化运维场景下(如服务实例下线、版本灰度发布等),如何保障玩家会话连续性成为云原生游戏连接治理的关键挑战。这不仅涉及连接状态的实时感知与迁移,更需要构建从基础设施到业务层的全栈治理能力,这正是实现云原生游戏连接治理的"最后一公里"。

基于业务状态的流量管理

为拉近这最后一公里的路途,OKG(OpenKruiseGame)【1】与 API 网关【2】结合各自优势(细粒度的状态感知与精细化流量治理),致力于打造新一代游戏网关,在不侵入业务架构的同时实现游戏服优雅下线、配置无感变更等能力。

优雅下线

游戏服务的强状态特性决定了其对优雅下线的迫切需求。传统下线操作往往无法满足游戏服务对特定条件的严格要求,可能导致玩家体验中断或数据丢失。为应对这一挑战,OpenKruiseGame 引入了自定义生命周期钩子的功能,突破了 Kubernetes 原生 PreStop 钩子机制的局限性,为游戏服务提供了精确到毫秒级的生命周期控制能力。

云原生 API 网关与 OKG 深度融合,构建了一套完整的游戏服务优雅下线解决方案。当 OKG 服务进入 PreDelete 状态时,云原生 API 网关会及时从注册中心剔除该实例,确保新的请求不再路由至即将下线的服务。与此同时,已建立连接的玩家会话则被智能保留,直至 OKG 服务完成自定义的生命周期管理流程^【3】^,实现了新老请求的分流处理,最大程度地保障了玩家体验的连续性,具体如下图所示:

为了直观展示这一过程,我们将以云原生 API 网关为例,通过监控活跃长连接数这一关键指标来模拟玩家数量变化,详细阐述 OKG 服务在云原生 API 网关上的优雅下线全流程。这不仅体现了云原生技术在游戏场景下的精细化应用,更彰显了现代游戏服务治理对状态感知与流量调度的高度融合。

接下来视频将直观的演示 OKG 服务在云原生 API 网关环境中的优雅下线过程。

如演示所示,具体部署步骤如下:

  1. 前置步骤:

开通 ACK 托管集群,安装 ack-kruise-game 和 ack-kruise 组件. 开通 API 云原生网关【2】。

  1. OKG 服务部署:

为了模拟真实的游戏环境,我们选择了开源游戏 Posio 作为我们的 demo 游戏服。通过以下 yaml 文件,可以快速构建一个多实例的游戏服务集群。

java 复制代码
apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
  name: postio
  namespace: default
spec:
  lifecycle:
    preDelete:
      labelsHandler:
        gs-sync/delete-block: "true"
  replicas: 3
  updateStrategy:
    rollingUpdate:
      podUpdatePolicy: InPlaceIfPossible
  network:
    networkType: Kubernetes-Ingress
    networkConf:
    - name: IngressClassName
      value: "higress"
    - name: Port
      value: "5000"
    - name: Path
      value: /
    - name: PathType
      value: Prefix
    - name: Host
      value: game<id>.postio.example.com
  gameServerTemplate:
    metadata:
      labels:
        gs-sync/delete-block: "true"
    spec:
      containers:
        - image: registry.cn-beijing.aliyuncs.com/chrisliu95/posio:8-24
          name: postio
      volumes:
        - name: gsinfo
          downwardAPI:
            items:
              - path: "state"
                fieldRef:
                  fieldPath: metadata.labels['game.kruise.io/gs-state']
  serviceQualities:
    - name: healthy
      containerName: minecraft
      permanent: false
      exec:
        command: ["bash", "./probe.sh"]
      serviceQualityAction:
        - state: true
          result: done
          labels:
            gs-sync/delete-block: "false"
        - state: false
          opsState: None

在这个示例中,我们通过 GameServerSet 创建了多个游戏服实例,每个实例都有其唯一的访问域名。具体而言:

游戏服0:game0.postio.example.com

游戏服1:game1.postio.example.com

游戏服2:game2.postio.example.com

这种域名设计不仅便于客户端精确访问不同的游戏服,也为后续的负载均衡和流量调度奠定了基础。通过这样的部署结构,我们可以模拟复杂的游戏服务环境,为优雅下线的实验提供真实可靠的测试平台。

在云原生游戏服务的优雅下线过程中,精确的状态感知和玩家会话管理至关重要。我们通过 YAML 脚本来实现这一复杂的过程,该脚本融合了状态检测、玩家活跃度监控和优雅退出机制。

  1. 状态感知 脚本首先从/etc/gsinfo/state文件中获取当前游戏服务(GS)的状态。这一步骤体现了对服务生命周期的实时监控能力,是实现精确控制的基础。

  2. 下线触发判断 当检测到 GS 状态为 "PreDelete" 时,脚本识别出服务已进入下线阶段。这种精确的状态判断确保了下线操作仅在适当的时机启动,最大限度地减少对玩家体验的影响。

  3. 玩家活跃度评估 进入下线流程后,脚本会持续监控与该游戏服务相关的活跃连接数。这里,我们巧妙地利用 API 云原生网关提供的连接数指标作为玩家在线状态的代理指标。这种方法不仅简化了实现,还提供了一个可靠的玩家活跃度衡量标准。

  4. 优雅退出机制 脚本会循环检查活跃连接数,直到该数值降为零。只有在确认所有玩家都已安全断开连接后,脚本才会输出 "done" 并以退出码 0 结束执行。这种机制确保了每一个玩家会话都得到了妥善处理,真正实现了"优雅"下线。

java 复制代码
#!/bin/bash

file_path="/etc/gsinfo/state"

if [[ ! -f "$file_path" ]]; then
    exit 1
fi
data="query=sum(envoy_cluster_upstream_cx_active{cluster_name=~\"outbound_5000__${HOSTNAME}.default.svc.cluster.local\"})"

state_content=$(cat "$file_path")

if [[ "$state_content" == "PreDelete" ]]; then
     json=$(curl -s -G --data-urlencode $data http://prometheus.com/api/v1/query)
     value=$(echo "$json" | grep -o '"value":\[[^]]*\]' | sed 's/.*"\([^"]*\)"]/\1/')
     if [[ -z "$value" || "$value" == "0" ]]; then
       echo "done"
       exit 0
     fi
     exit 1
fi
exit 1

无感变更

在现代游戏生态中,服务的持续优化和更新是保持竞争力的关键。然而,传统的配置变更方式往往伴随着服务中断,这对于游戏场景而言是难以接受的。玩家沉浸式体验的核心在于不间断的实时交互,即便是瞬间的连接中断也可能导致游戏体验的严重退化。因此,实现真正的"无感变更"成为了游戏服务质量提升的重中之重。

为了应对游戏长连接场景中配置变更的独特挑战,云原生 API 网关在开源 Higress 网关基础配置能力之上【4】针对性地解决了传统方案在高阶能力变更(如自定义插件添加与删除、日志格式添加、全局参数变更)时面临的连接中断问题,特别契合游戏长连接的严苛需求。

云原生 API 网关针对游戏长连接场景中配置变更的独特挑战,在开源 Higress 网关基础配置能力之上,推出了一套全面的商业化解决方案。这一方案不仅继承了 Higress 的优势,更突破性地解决了传统方案在高阶能力变更时面临的连接中断问题,完美契合游戏长连接场景的严苛需求。

云原生 API 网关解决方案具有以下核心优势:

  1. 高阶能力无感变更

重点解决了自定义插件的添加与删除、日志格式的动态调整、全局参数等高阶配置修改时的连接保持问题。这些操作现在可以在不中断现有游戏会话的情况下平滑完成,极大地提升了服务的可维护性和灵活性。

  1. 长连接场景优化

专门针对游戏行业普遍存在的长连接特性,设计了独特的连接保护机制。即使在进行复杂的配置调整时,也能确保玩家的长时间会话不被中断,从而维持游戏体验的连续性。

0 改造、易接入

  1. 零门槛接入,瞬时提升

"即插即用"设计:OKG 服务可直接接入云原生环境,彻底消除代码改造的繁琐过程。 从决策到部署,最快仅需数分钟,让您的游戏服务立即享受云原生技术带来的全方位优势。

  1. 全维度可观测性

丰富的 Prometheus 指标, 只需简单配置 Prometheus URL,即可实现自动接入。 预配置的仪表板直观呈现关键指标,让游戏服务的健康状态一目了然。

  1. 简化的 API 治理

直观的控制台界面革新了 API 管理体验,将复杂的配置流程简化为几次点击操作。 预设模板覆盖常见游戏场景,使得流量控制、负载均衡等高级功能触手可及。

通过这套解决方案,我们不仅缩短了云原生游戏连接治理的"最后一公里",更为游戏服务提供商开辟了一条全新的发展道路。它使得游戏开发团队能够将更多精力投入到核心 gameplay 的创新中,同时享受到云原生技术带来的全方位性能提升和运维效率优化。

加入 OKG 和 Higress 开源社区交流

欢迎大家通过搜索群号的方式进入钉钉群交流,云原生游戏交流群的钉钉群号为:44862615,Higress 社区交流 3 群的钉钉群号为:107690002780。

相关链接:

【1】OpenKruiseGame

openkruise.io/kruisegame/...

【2】云原生 API 网关

help.aliyun.com/zh/api-gate...

【3】自定义生命周期

openkruise.io/zh/kruisega...

【4】Higress × OpenKruiseGame 游戏网关最佳实践

developer.aliyun.com/article/144...

相关推荐
遂心_3 小时前
深入解析前后端分离中的 /api 设计:从路由到代理的完整指南
前端·javascript·api
电商API大数据接口开发Cris5 小时前
Node.js + TypeScript 开发健壮的淘宝商品 API SDK
前端·数据挖掘·api
用户268001379195 小时前
闲鱼商品详情API接口系列,json数据返回
api
用户268001379195 小时前
唯品会商品详情API接口返回数据是怎样的?
api
Rockson7 小时前
期货实时行情接口接入教程
python·api
得帆云低代码8 小时前
跨境业务数据 “脱缰”?API网关为企业出海开启“安全锁”
api
Smartdaili China3 天前
使用抓取 API 可靠高效地提取亚马逊 (Amazon)数据
python·api·亚马逊爬虫·亚马逊代理·amazon代理ip·亚马逊爬取·亚马逊数据
dearxue9 天前
Api 设计,你的max/min 长度、元素数与属性数用对了吗?
java·spring·api