微服务在游戏服务端技术上的实践及思考

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 本文主要描述了使用阿里云容器服务在游戏服务端研发运维方面的实践,分析总结了实践中遇到的问题和解决方案以及一些设计思路,希望能抛砖引玉。

游戏服务端架构演进方向

网络游戏目前主要分为四类:个人计算机客户端网络游戏(PC端游)、个人计算机网页游戏(PC页游)、手机客户端网络游戏(手机端游)、手机HTML5网络游戏(手机页游)。现在的游戏服务端框架大体都是从最早的PC端游时代演化而来,从单机系统向分布式系统演化,从单体架构向微服务架构演化,详细资料可查阅本文所列参考资料,这里不再赘述,比较有代表性的开源游戏服务端框架有:SkyNetPomeloComblockEngine(KBEngine)

DevOps逆向架构设计

我相信我们团队和其他大多数团队在研发运维上的设计差异较大,大部分团队都是先从研发角度考虑软件系统的架构设计,其次再考虑怎样自动化运维,最后再考虑如何向DevOps方向转化,而我们团队是逆向设计的,我们先思考如何做DevOps,再思考怎样的架构设计能更有利于自动化运维,最后才是考虑系统架构设计,其实就是以终为始。能这样做主要是基于以下几点:我们团队没有端游、页游的历史包袱,直接进入手游时代;我们团队主要研发策略养成类游戏,系统架构需求和端游、页游时代的MMORPG、MOBA差异较大,我们针对性重新设计并积极思考如何利用云计算时代的微服务、容器技术更好地解决研发运维问题。2016年我们先从运维开始调研了一些自动化运维工具如SaltStack、Ansible、腾讯蓝鲸平台,那时容器技术已经在一线大型互联网公司普及使用,我们也尝试调研了容器技术。

当时调研后觉得容器技术是与云计算环境结合紧密的技术(那时还不知道云原生)而且比较彻底的解决了环境依赖问题(基础设施即代码),判断这一定是未来运维的趋势,所以果断确定了今后的运维方向一定是基于容器技术,有了容器技术才能更好地支持持续集成和持续交付。我们当时已经做了一定程度的服务拆分,便开始在一些辅助服务的生产环境尝试使用容器热更新发布版本,实验结果证明确实很好用。使用容器也带来一些问题:服务是无状态或将状态转移到共享存储比较适合容器,如果容器保留状态对于分布式系统来说会比较复杂;要满足分布式系统服务的滚动更新、蓝绿发布、灰度发布等热更新需求,就需要有完善的容器监控管理工具,这就是容器编排;如果只是使用容器部署单体应用相对简单,如果要微服务化则还要配套服务监控、服务注册与发现、服务治理、配置中心、日志聚合等一系列工具。

不管怎样要部署大规模分布式系统仅使用单个容器是不解决问题的,一定是要使用容器编排的。2016年容器技术正是群雄逐鹿的年代,各种容器技术团队混战,这对于大多数研发团队技术选型来说难以抉择。我们当时对运维的思考是底层基础运维全部依赖于云商,我们只专注于做自研服务的运维,基于这种思路很自然容器编排的底层运维也依赖于云商,这样可以随时切换基础设施而不过多地投入调研,云商有什么我们就用什么,当时阿里云只有Docker Swarm产品,于是我们就选了Docker Swarm。天下大势合久必分、分久必合,2017年容器编排群雄混战的局面终于结束,Kubernetes一统天下,阿里云也很及时地同时上线了Kubernetes容器服务产品,我们果断开始将容器编排方案向Kubernetes迁移。从Docker Swarm到Kubernetes我们团队都是使用阿里云容器服务的第一批客户,也是首个游戏行业用户,阿里云还专门为我们建立了容器技术服务群,协助解决各种产品问题和线上问题,我估计我们公司也是国内最早一批在游戏项目生产环境大规模使用容器编排的公司,我们以实践证明了完全使用容器编排运维游戏项目的可行性而且确实极大地提升了运维效率。

到这里DevOps流程中运维环节基本定型,我们还要打通从开发到运维的自动化环节,也就是持续集成和持续交付。有了容器技术支撑,剩下的问题就比较好解决,我们使用GitLab搭建持续集成流水线(现在已经支持Kubernetes),但还有些自动化工作需要细化。这里顺便提下我们对运维的愿景和理念:我们希望运维成员是SRE工程师而不是像传统运维干体力活,提供运维解决方案而不是按照固定流程或模式去操作,后端服务谁开发谁运维(参考AWS),最终目标是人管理代码、代码管理机器、人不管机器(陈皓),总之方向是智能化和自动化。这对运维人员的要求比较高,传统的运维人员研发能力较弱,但是SRE工程师要求同时具有开发、运维、架构设计能力,对于中小型公司从市场上招聘当然是很难的,所以我们完全是自己培养也用这样的目标激励团队成长。如果把运维的目标定地过低,那运维最终就是纯体力活,这样招人是容易,但想做DevOps是不可能的。

在我看来开发不懂运维或是运维不懂开发想做好DevOps都是件困难的事,因为无法以终为始,有了DevOps基础才能考虑微服务架构。

微服务化

首先说明一下我们为什么要微服务化,微服务是一把双刃剑,解决一些问题的同时产生了另一些问题,所以在架构设计上要权衡利弊。微服务的技术栈和工具链比较复杂,需要投入较多的人力和时间成本,对于创业初期的小团队我认为是不太适合使用的,但可以做一定程度的服务拆分。系统架构往往是跟着业务模式演进的,是一个动态的过程,所以时机很重要,过早使用复杂的技术方案会影响研发进度,过晚重构或改进技术方案也会影响研发进度,这就是人们常说的短期看高估技术的作用长期看低估技术的作用。当一个公司随着业务发展到一定规模后,研发要下沉并演化出技术中台,阿里集团就是沿着这种路径发展的,从最早的原始系统发展到研发数据库、操作系统、人工智能、服务器、芯片。当一个小微公司向中型公司快速发展的时候,为了更好地使技术服务于业务发展,就需要一个技术中台支撑,这时可以考虑是否微服务化。再看我们的业务场景,策略养成类手游的特点是弱联网、高并发、水平扩展、高可用、弹性伸缩、持续交付,符合微服务解决的问题。微服务还有个很大的优点就是独立部署和维护,这样后续的技术迭代不会受到编程语言或其它环境的影响,服务之间从物理上解耦合有效降低了重构一个服务的成本,我们团队现在的方案是依赖数据库实现数据强一致性的,肯定不是最佳实践,还有优化空间。

接着需要解决微服务带来的问题:首当其冲的是响应时长会增加,这点对于策略养成类手游来说影响不大,但也需要做些性能优化;需要有服务降级、过载保护等容错机制,避免并发阻塞引起整个系统雪崩;分布式节点增加故障排查复杂度,需要有一套服务监控和调用链追踪体系,日志聚合是必不可少的,我们对比了Logstash、Fluentd、Flume等日志收集工具,发现阿里云Logtail性能和吞吐非常突出,而且可以和阿里云容器服务无缝对接,但只能使用阿里云的日志服务接收日志,不想自己搭建日志聚合环境的可以试试;大规模集群管理需要有服务注册发现、配置中心配合容器编排等工具做服务治理;最难处理的一个问题是分布式系统的数据一致性问题,游戏不像其它互联网系统多数情况下最终一致性或弱一致性就能满足需求,游戏很多场景都需要数据强一致性,这也是为什么游戏项目难以微服务化的原因。

微服务配合容器技术可以实现高可用、水平扩展、热更新,这些特性与手游这种快速开新区服(滚服)的情况非常匹配。传统游戏服务端框架一般用脚本语言实现热更新,而微服务架构则是使用蓝绿发布、灰度发布、滚动更新等模式使用容器镜像实现。

数据一致性

数据一致性问题一直是分布式系统的一个经典难题,CAP和BASE理论是分布式系统数据一致性问题的理论基础。很不幸的是游戏业务场景大多数需要数据强一致性,或者说数据强一致性能获得良好的用户体验。

游戏战斗模式分为两大类:PVE模式和PVP模式。其中,PVE模式又分为个人战和团战,PVP模式又分为本服个人战、跨服个人战、本服团战、跨服战团战。不同游戏类型不同模式在数据处理上的要求差异较大:PVE团战可以转化为一个线性一致性队列问题,根据对性能的不同要求处理细节也会有些区别,若业务场景要求强一致性需要做一些性能优化,若最终一致性能满足要求异步返回结果就可以;PVP个人战或本服团战一般用锁来控制数据一致性,使用锁的前提是不能在同一时刻产生访问临界资源的高并发请求,否则会导致系统过载或响应延时;PVP跨服团战传统方案中解决数据一致性需要把不同区服的数据拉到同一个内存中,这样就把分布式数据一致性问题转化成单机数据一致性问题。

传统单体架构的游戏服务端用锁和内存基本能解决数据一致性问题,一般这种模式请求不直接访问数据库而是访问内存,再以批量同步的方式将数据持久化。对于微服务来说解决数据一致性问题复杂度较高,通常微服务需要无状态或将状态转移到共享存储(一般就是数据库或缓存),每个服务都使用自己的数据库持久化,而且容器的生命周期是动态的,也就是说内存并不是固定的,这种模式天然就难以在内存中实现数据强一致性。一种方案是使用分布式事务机制依赖数据库实现,这种方案比较复杂而且对性能有一定影响。我们目前是使用数据库事务和锁结合解决,这时如果要处理跨服战可能需要将不同区服数据同步到一个数据库处理,否则就要实现分布式事务。还有一种思路就是基于容器特性实现一套游戏分布式内存数据管理中间件,这种模式就需要在容器中保存状态,并且需要处理容器调度时的数据迁移问题,这又是一个复杂的问题。

综上所述,对于微服务的游戏数据一致性解决方案还在探索和优化中,这也是引入微服务和容器技术的代价。对于我们团队综合评估来说,基于微服务和容器技术的游戏技术中台对游戏后端研发生态的演进提供了一个基础支撑平台,在此平台上不断衍生出新的服务和技术支持并逐渐实现研运自动化,这是我们想看到的。

参考资料

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
20天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
26天前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
22天前
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
22天前
|
算法 NoSQL Java
微服务架构下的接口限流策略与实践#### 一、
本文旨在探讨微服务架构下,面对高并发请求时如何有效实施接口限流策略,以保障系统稳定性和服务质量。不同于传统的摘要概述,本文将从实际应用场景出发,深入剖析几种主流的限流算法(如令牌桶、漏桶及固定窗口计数器等),通过对比分析它们的优缺点,并结合具体案例,展示如何在Spring Cloud Gateway中集成自定义限流方案,实现动态限流规则调整,为读者提供一套可落地的实践指南。 #### 二、
47 3
|
25天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
83 5
|
21天前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
33 1
|
22天前
|
监控 安全 持续交付
构建高效微服务架构:策略与实践####
在数字化转型的浪潮中,微服务架构凭借其高度解耦、灵活扩展和易于维护的特点,成为现代企业应用开发的首选。本文深入探讨了构建高效微服务架构的关键策略与实战经验,从服务拆分的艺术到通信机制的选择,再到容器化部署与持续集成/持续部署(CI/CD)的实践,旨在为开发者提供一套全面的微服务设计与实现指南。通过具体案例分析,揭示如何避免常见陷阱,优化系统性能,确保系统的高可用性与可扩展性,助力企业在复杂多变的市场环境中保持竞争力。 ####
39 2
|
22天前
|
消息中间件 运维 API
后端开发中的微服务架构实践####
本文深入探讨了微服务架构在后端开发中的应用,从其定义、优势到实际案例分析,全面解析了如何有效实施微服务以提升系统的可维护性、扩展性和灵活性。不同于传统摘要的概述性质,本摘要旨在激发读者对微服务架构深度探索的兴趣,通过提出问题而非直接给出答案的方式,引导读者深入
41 1
|
23天前
|
负载均衡 监控 API
后端开发中的微服务架构实践与挑战
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势和面临的挑战,并通过案例分析提出了相应的解决策略。微服务架构以其高度的可扩展性和灵活性,成为现代软件开发的重要趋势。然而,它同时也带来了服务间通信、数据一致性等问题。通过实际案例的剖析,本文旨在为开发者提供有效的微服务实施指导,以优化系统性能和用户体验。
|
23天前
|
弹性计算 Kubernetes API
构建高效后端服务:微服务架构的深度剖析与实践####
本文深入探讨了微服务架构的核心理念、设计原则及实现策略,旨在为开发者提供一套系统化的方法论,助力其构建灵活、可扩展且易于维护的后端服务体系。通过案例分析与实战经验分享,揭示了微服务在提升开发效率、优化资源利用及增强系统稳定性方面的关键作用。文章首先概述了微服务架构的基本概念,随后详细阐述了其在后端开发中的应用优势与面临的挑战,最后结合具体实例,展示了如何从零开始规划并实施一个基于微服务的后端项目。 ####