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

1

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

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

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

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

基于业务状态的流量管理

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

2

优雅下线

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

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

3

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

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

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

  1. 前置步骤:

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

  1. OKG 服务部署:

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

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 结束执行。这种机制确保了每一个玩家会话都得到了妥善处理,真正实现了"优雅"下线。

#!/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

https://openkruise.io/kruisegame/introduction

【2】云原生 API 网关

https://help.aliyun.com/zh/api-gateway/cloud-native-api-gateway/product-overview/what-is-cloud-native-api-gateway

【3】自定义生命周期

https://openkruise.io/zh/kruisegame/user-manuals/lifecycle

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

https://developer.aliyun.com/article/1440348?spm=5176.26934562.main.1.5769356b3EZsWh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值