KMS在腾讯云的微服务实践助力其降本50%
背景介绍
KMS 是一家日本的游戏公司,主要经营游戏业务、数字漫画业务、广告业务、云解决方案业务等,出品了多款在日本畅销的漫画风游戏,同时有网络漫画专业厂牌,以内容创作为目标,拥有原创 IP 创作、游戏开发等多元化发展的业务。
KMS 曾经是微软 Azure 的标杆客户,曾经在 Azure 的 Customer story 里有详细的介绍,主要是使用了 Azure 的 App Service。
2021年,KMS 开始迁移到腾讯云,并把第一款产品部署在了腾讯云上。从 Azure 迁移到腾讯云上后,整体成本降低50%。下面我们就来讲讲他们在腾讯云上的微服务实践。
挑战与痛点
KMS 的架构主要有以下特点:
1. KMS 的架构设计的特点是围绕不同的游戏有不同的终端。
2. 但同时又有统一的后台管理平台、统一的底座等。
3. 客户在游戏场景的不同的客户端主要包括安卓,iOS,Web 等。此外,客户后端又分为战斗系统、管理系统、用户系统等。
4. 游戏业务通常都有波峰波谷,在业务高峰期的时候需要快速扩容来支持大量的游戏玩家;在业务低峰期的时候,需要缩容来节约成本。
那么基于此类场景的架构设计,面临最大的问题就是在游戏的不同时间段的弹性扩缩容问题。不同的业务模块需要弹性的频率和范围都是不一样的。不同的微服务划分会带来不一样的弹性伸缩频率和范围。这直接影响到了最终资源的用量,也就直接反应到了成本上。
架构设计
接下来就分别把 KMS 在腾讯云上的架构设计实践的几个部分分开来介绍一下。
整体设计
游戏业务通常都有各种客户端,比如安卓、iOS、网页等,为了应对不同的场景,架构设计上也应该有一定的区别。
首先,必须有 CDN 来提供静态文件的分发,包括游戏资源、安装包、图片等。这些文件底层都是存储在 COS 上的。
然后对于不同的客户端,会有不同的后端实例来承载它的流量。比如战斗系统,iOS 客户端在同一个战斗里的用户,会在同一套战斗系统的实例里。
那对于管控端来说,压力没那么大,可以所有的客户端都用同一套管控端的实例,因为它只负责一些通用的用户设置的管理等。所以通常访问的 QPS 不会太高。
下图就是 KMS 大致的整体架构图。
弹性伸缩
在游戏高峰期,对于访问压力大的服务,怎么去解决这样的流量波峰波谷呢?
KMS 是选择使用腾讯云的弹性微服务来解决。
弹性微服务(Tencent Cloud Elastic Microservice)是面向微服务应用的 Serverless PaaS 平台,实现资源 Serverless 化与微服务架构的完美结合,为用户提供一整套开箱即用的微服务解决方案。
由于它已经 Serverless 化了,因此用户不需要再关心底层资源,只需要按照自己的使用量,配置对应的弹性伸缩策略,就可以在流量波峰来的时候,实现秒级的扩容。
弹性伸缩的策略也非常丰富,支持定时伸缩与指标伸缩。
定时伸缩可以根据业务的时间特征来设置,比如游戏的高峰通常是在晚上,而上午通常都是低峰期,那么就可以定时设置,上午只保留基本的资源量,保障较小的流量正常进行,以节约资源成本。在晚上高峰期,就可以提前拉起更多的资源,以保障晚上高峰期的资源充足。
指标伸缩可以用来应对突发的流量。比如某个时间段因为某种原因突然来了大量的用户玩游戏,如果资源不足,等发现问题再扩容,可能导致用户体验差。这时就可以设置指标扩容,比如当服务的 CPU 或内存使用率达到60%用户就开始扩容,同时可以设置扩容范围,比如让实例数在1-50之间扩容。这样,就可以根据指标动态的保障用户的资源充足了。
经过 KMS 实际的测试发现,在单个实例的测试场景中,同等规格的实例,性能上腾讯云的弹性微服务比 Azure 的 App Service 高15%,游戏响应延迟降低50%。KMS 迁移到腾讯云后,整体成本降低50%以上。
DevOps
游戏业务通常都会有较频繁的发布周期,以满足快速发展的游戏市场,和满足不同玩家的游戏体验。
因此快速且安全的发布也必不可少。于是 KMS 搭建了一套能在弹性微服务上快速部署的 CICD 流程。如下图所示。
首先,KMS 编写了大量的自动化测试,包括单元测试和集成测试。因为 KMS 是使用的 GitHub,所以在代码提交后,就会自动触发 GitHub Actions 运行测试、构建、上传等操作,实现自动打包构建镜像等,最后 CD 流程会把构建好的镜像部署到弹性微服务中去。
这里的部署就需要说到 KMS 的分批发布实践了。
分批发布
KMS 原来在 Azure 的时候,做发布需要自己准备资源,并自行完成更新,同时需要自己保障过程中的滚动更新。而当他们使用了弹性微服务的发布之后发现,这个过程是如此丝滑。
首先,弹性微服务会根据当前已有的实例数,选择分几批进行升级更新。每批次的发布都可以自动执行或者手动执行。在关键的发布时,KMS 会选择手动执行,这样每批次完成后,先手动验证一下功能的正确性,再进行下一批次的发布。
如果某个批次的发布有任何问题,可以马上选择回滚,不会影响线上业务。
以上就是 KMS 在腾讯云上基于弹性微服务的分批发布实践。
其他设计
除了上面介绍到的实践之外,KMS 结合自身的业务特性,还做了很多额外的其他工作,来保障游戏服务的正常运行。
比如,为了更好的优化资源成本,KMS 会在夜间把测试环境的资源一键归零,然后在早上上班的时候一键开启。同时,此过程已经被 KMS 集成到自动化流程中,每天自动触发了。
另外,在 App Service 之前若有实例存在内存问题时,需要重启。一般都需要1个小时左右。
而 KMS 使用了弹性微服务之后,弹性微服务会对实例进行检测,若有问题会自动进行重启。这里主要是利用了弹性微服务的健康检测能力。
此外,KMS 一共有4个游戏发行平台,4套环境,KMS 利用弹性微服务的环境管理,合理的分配了不同的平台,便于管理与运维,极大的提升了运维效率。
总结
KMS 是一家以内容创作和原创 IP 创作为目标的专业厂牌,曾是微软 Azure 的标杆客户,如今已经在腾讯云稳定运行超过2年了。
他们在2021年迁移到腾讯云后,通过合理的架构设计和产品使用,让他们成本降低了50%。
未来也期望 KMS 和腾讯云能有更多的合作,分享更多的架构设计经验和上云最佳实践。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
实战总结|记一次迭代需求中的微型代码重构
大家好,我是钉钉业务平台前端技术的单丹。以往,历经考勤、日志、审批、开放平台、工作台等多个钉钉重点业务,分享更多的是偏技术架构或业务思考,这次,仅记录下程序员一次普通的日常需求中的微型重构过程。 需求背景 一个页面如下左图,需求是将红框内的部分移动到红线箭头所指的位置去,达成右图效果。 需求评估 没看到原页面代码之前可能认为这是个很小的需求。页面上组件移动一下位置不就好了嘛。需求很快完成,业务方满意,我们都有美好的明天。看了代码顿觉自己天真。并没想象的这么简单,而且很容易出错。为描述清楚原因,下面使用了字母缩写,大家可不用理解其中的业务含义。 要完成这个需求,要做的应该是这三件事: 1. 找到目标位置 2. 找到目标组件 3. 移动 先分析下现在的页面结构:页面Page包含A和B两个组件,组件A有a1和a2两个子组件,目标位置就在a1和a2之间,目标位置很清晰。问题在B里。要移动的b1部分是在组件B内,但b1不是一个组件,而是一堆在B内部的代码。b1逻辑中出现了2个组件AR和HR,不同条件下可能展示其中之一,或者不展示。且b1依赖了B上下文的10个属性。如果目标b1不是组件,移动复杂...
- 下一篇
Kubernetes跨StorageClass迁移,切换Rainbond默认SC
基于主机安装或基于Kubernetes安装的 Rainbond 集群(均使用默认参数安装),默认使用的共享文件存储是 NFS ,以 Pod 方式运行在 Kubernetes 中,但这种方式也有一些无法避免的问题,比如:NFS 的 SVC 无法通信时集群无法挂载存储则导致不能使用、服务器关机时卡在 umount 导致不能正常关机等等。 当然还有切换共享文件存储的需求,在第一次安装 Rainbond 时,大多数都使用的默认安装,使用一段时间后想切换到外部的 NFS,或者云上的 NAS等等。 在原生的 Kubernetes 集群中,通过 StorageClass 创建的 PVC 是无法修改存储后端的,需要将 PV、PVC 删除后通过新的 StorageClass 创建新的 PVC,然后再将数据迁移,再重新挂载 PVC。当有很多个 PVC 时,需要多次重复的操作。 而 Rainbond 虽然也是通过 StorageClass 创建的 PVC,但相比原生 Kubernetes 省去了创建 PV、PVC 和重新挂载的步骤,以及重复性的操作。在 Rainbond 中只需要将底层存储类更换,然后迁移 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7设置SWAP分区,小内存服务器的救世主