游戏业务的不停服更新

ronald2年前职场5340

一. 概述

        前面说到,游戏业务属于内容向的互联网业务,有着运营灵活、内容更新频繁等特点。从玩家游戏体验考虑,游戏的运营方希望做到游戏内容的变更对于玩家来说无感知,也就是做到不停服的游戏更新。游戏更新从更新范围和内容上分为:

        1. 运营版本更新(即常规运营活动的发布)

        2. 紧急版本更新(即现网程序bug和配置错误的紧急修复)

        3. 大版本更新(即月度或者季度大型游戏玩法发布)三类。

       而为了在保证游戏服务不中断的前提下应对上述发布需求各个项目组也研发出各自的系统架构,这里介绍应用比较广的几种:

        1. 基于共享内存和信号处理的游戏进程结构

        2. 基于C++/Lua混合编程的进程结构

        3. 基于流量治理的发布机制

        下面将结合游戏发布场景逐个进行介绍。

二. 基于共享内存和信号处理的游戏进程结构

        游戏业务的更新发布总体上可以分为配置更新和应用程序更新:

    1. 对于配置更新

        是指在游戏进程的底层框架在初始化的时候就进行相关的信号注册,当需要更新的配置分发到进程的配置目录的时候给对应进程发信号,触发进程重载配置的逻辑,进程读取配置之后则新的配置立刻生效。整个过程就相当于重新调用了一个读取配置的接口,整个流程对玩家的游戏体验是无感知的。

    2. 对于程序更新

        本进程结构的做法是:首先将业务层和接入层进行分离,由接入层负责链接的维护,而由业务层进行逻辑的处理,同时应对产品复杂的需求;其次业务层进程将进程数据放在共享内存之中,这样当有程序需要更新的时候,直接重启业务进程,因为数据都是缓存在共享内存中,所以游戏进程重新挂载即可,原先的状态并没有丢失,另一方面链接由接入网关层统一管理,客户端并不会因进程重启而掉线,因而整个过程对于用户无感知。

    这样的游戏进程结构可以应对线上大部分的配置更新和逻辑更新,但是由于游戏进程的数据托管在共享内存中,因此本框架并不能适配于共享内存结构发生变化的发布场景。

三. 基于C++/Lua混合编程的进程结构

        这种结构是利用了脚本语言作为解释性编程语言在程序运行时才进行翻译的特性。底层代码比较稳定不常变动or调用频繁性能要求高的部分由C++代码实现,而其他调用频度不高的业务逻辑交给脚本语言(比如Lua)来实现。在这样的进程结构下,实现逻辑变更可以做到配置变更一样,将对应的Lua脚本通过配置中心将代码像分发配置一样,分发到对应的代码目录下,并给i进程发送信号,触发脚本重载的操作。

    这种进程结构下,逻辑变更相对前者更加轻量,但是也存在一些问题:

     ① C++部分代码变更无法做到支持

     ② Lua的执行性能使得不能应用于对性能要求较高的业务场景


四. 基于流量治理的版本更新机制

        这种更新机制的发展受启发于云原生思想并得益于底层存储组件、通信组件等技术及设计理念的发展。随着存储技术的提升,很多游戏业务的后台进程可以选择利用数据库缓存游戏进程状态,从而使得业务进程可以做到弱状态,甚至完全无状态;而另一方面,随着消息组件的发展,游戏后台系统的进程之间不需要直接对接,而是只需要和底层消息队列建立链接,通过消息队列进行消息收发,使得进程之间由原先的网状和星状结构变成以消息队列为主干的树状结构。

    在此背景下,业务进程的功能被拆分的更细,更加聚焦,如有专门的聊天服务、邮件服务、商城服务等;而对于后台的单一服务,由多个对等进程构建的进程组提供。消息队列通过特定的路由规则,将新的请求分发到进程组中某一个节点上进行处理,此时若是需要某个业务进行更新,则通过将进程组分为A/B组,对其中一组执行下线操作(但是不停进程),则针对后端的无状态路由请求会被派发到未被下线的进程组那里;而由于进程未停止,原先未走完的事务可以通过有状态路由(即指定收包端节点的方式)保证中间态的事务可以顺利完成,当下线后的残留事务完成之后,我们可对这些进程进行停机更新的操作,更新完成顺利上线后另一组同理。

    基于流量治理的版本更新方式,应用面比较广,不仅可应用于配置更新、逻辑更新,还可以应用于数据结构更新的发布场景,甚至可以做到大版本更新也对用户无感知。但是相比前面两种发布机制,流量管理的发布方式操作更重,运维也更加复杂。


后记

        本文介绍了不停服更新的几种方式,以及各自优缺点和适用的场景,当然还有一些其他的不停服更新的机制,比如生成动态链接库等,这里只是挑了几种典型的发布机制进行介绍,不同的项目可以针对自己项目的具体情况、团队的技术栈等,进行对应的架构选型。


相关文章

Lua的垃圾回收(下)

Lua 5.3版本的垃圾回收Lua垃圾回收源码实现    结合前面描述的垃圾回收的流程,我们参照源码进行逐个的拆解和介绍。    lua的垃圾回收主要都是在接口luaC_step里面完成的,这里面本质上是控制了一个状态机,根据global_State->gcstate进行渐进式的垃圾回收处理。GCSpause&n...

关于LUA(上)

    Lua是一种轻量小巧的脚本语言,C语言编写,并提供了易于使用的扩展接口和机制,易于嵌入到应用中,在游戏开发中经常被用来进行外层业务系统的开发。Lua的table    Lua的基本数据类型有八种,分别是:nil、boolean、number、string、userdata、function、thread 和 t...

关于LUA(下)

关于LUA(下)

Lua与OOP    Lua是面向过程的语言,不提供面向对象的特性,但是我们可以利用Lua的元表和元方法模拟面向对象的效果。OOP的特性封装    所谓封装,是隐藏对象的属性和细节,仅对外暴露公共的访问方式。本质上分为两层:    1)成员变量和成员方法,提升代码的内聚性,降低模...

聊一聊面试(一)

聊一聊面试(一)

  前些天一些叔伯辈的小孩大学要毕业了,可能感觉计算机行业赚的有点多,一些不怕加班的也想进入这个行业,于是就辗转找到我,希望帮忙做一些这个方面的面试辅导;而我趁着这个机会,对过去的一些思考进行沉淀,分享出来和大家交流一下。    在我看来,面试主要考察能力项包括:专业能力、沟通能力、思维能力、学习能力、思考能力和抗压能力五大方面;投射到实...

第一次引擎编程尝试

第一次引擎编程尝试

软硬件要求第一次引擎编程尝试给打出的子弹增加爆炸效果    默认创建的FPS游戏子弹击中物体无特殊效果,仅子弹消失,现在我们希望子弹击中物体之后有爆炸的效果,如下所示:粒子系统    粒子系统是计算机图形引擎中模拟一些特定模糊现象的技术,如火、爆炸、烟雾、水流等效果;在项目工程中,美术在引擎里面制作粒子特效,保存下来就...

协程-有栈协程(libco)

协程-有栈协程(libco)

libco      还有一个广泛使用的协程库就是libco,libco是被由微信开发并大规模应用的协程库,自2013年起稳定运行于数万台微信后台机器上;具备以下特性:高性能,号称可以调度千万级协程在IO阻塞时,可以自动切换,利用hook技术+epoll事件循环实现阻塞逻辑IO化改造支持嵌套创建既支持共享栈模式也支持独立栈模式提供超时管...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。