最佳实践

文档中心 > 云函数 > 客户案例 > 互动娱乐行业案例

互动娱乐行业案例

最近更新时间:2021-08-30 09:32:00

客户介绍

国内某互动娱乐科技有限公司成立于2018年,是一家集手游研发、运营、发行业务为一体的综合型游戏公司。
公司主营业务为移动网络游戏的研发与发行,创立之初定位为全球性、国际化的游戏公司,致力于开发 global 级别的移动游戏产品并推广至全球。旗下产品现已推广至日本、俄罗斯及多个欧美国家。

客户痛点

社交,是游戏玩家的一项基本需求。在游戏中,成熟稳定的聊天系统担负着玩家交流的重要使命。随着在线人数逐渐增多,系统的稳定性和成本将面临着更多的考验。于是,升级技术栈势在必行。至此,核心目标已经出现,以保障性能为前提,同时做到省事和省钱。最终,腾讯云 Serverless 云函数产品提供了解决方案。

云函数,无需服务器,省去运维烦恼,只需关注于业务逻辑代码,省事快捷。按量付费,用多少花多少,避免业务低谷期的资源浪费,降低成本。非常适合游戏聊天系统 API 这类复杂度低的中小型需求。

Serverless 解决方案

少改代码

原来的 API 部分采用 swoole 作为底层扩展,部署在腾讯云 CVM 上,并使用腾讯云的负载均衡来接收外部请求。代码层面则是使用了 composer 进行包管理,一款开源的 easyswoole 框架作为 HTTP 业务的架子。

换用云函数方案,非代码层面则变成了腾讯云 API 网关加云函数来提供服务,而为了方便,依然需要继续使用 composer 进行包管理。原来基于 swoole 的 HTTP 框架无法继续使用,因此重点需要在此修改代码。

首先就是逻辑入口。需要确保用一个云函数来处理所有请求,毕竟云函数个数有限,而业务需求无限。
入口本质是一个路由,而企业研发团队需要进行的就是定义一种简单的路由格式,并在云函数入口代码处得到需要的信息,并转给原有的类进行处理,并返回特定的内容。

这类提供一个简单的 URL 格式例子:https://url/controller/action?query
只需要解析云函数给出的 path,就能得到 controller 和 action,做一些判断后,调用相应类的方法,然后返回。基于这样的入口,原有的逻辑处理类即可以被调用到。

其次,需要处理原先逻辑处理类的父类,弃用框架后需要研发团队研发一个基本功能的父类,例如获取 querystring 内容、解析 Body,返回统一格式的返回值等。如下图所示:

说明:

上图中使用 PHP 作为示例,不同的语言,解决方案思路都类似。另外代码里还有一些需要改动的地方,例如数据库配置信息,云函数可以用环境变量来传递。

快速发布

快速发布能力在实际应用中较为重要,因为在迁移过程中需要反复尝试。使用 API 网关和云函数的组合时,发布流程如下:

  • 1开发代码。
  • 2部署云函数$LATEST版本。
  • 3基于$LATEST版本打一个新版本号。
  • 4API 网关对应路径切换版本。
  • 5API 网关发布测试版本。
  • 6API 网关线上使用版本切换。

稳定的功能,用稳定的版本执行发布流程。新的功能,通过新建一个 API 路径,指向$LATEST版本,这样随时发布云函数也不会影响线上功能。

内网互通

在迁移场景中,原有系统里依然还有许多部分需要继续使用,因此需要云函数可以和原有的内网进行通信。云函数本身支持部署到已有的内网中,能够轻松事项内网互通。

由于 API 服务需要向外发出请求,而内网云函数不具备访问外网能力,此时可以通过 NAT 网关解决该问题,具体的方案请参见 NAT 网关 文档。

需要注意的是,NAT 网关的外网解决方案下,最好单独给云函数分配一个子网。使用已有的子网绑定 NAT 网关,会导致出口 IP 变化。如果该子网下的机器 IP 刚好在某些白名单下,将造成影响。

日志查询

在使用云函数之前,日志都是直接落盘,定期压缩转储。而迁移到云函数之后,即可利用云函数的日志机制。云函数可以直接投递日志到腾讯云 日志服务 中,任何直接输出的信息,都会直接作为日志投递。

函数入口的原始信息、URL 路径、客户端 IP、解析后的参数以及业务日志等都进行了输出,方便快速定位和查询。

耗时任务处理

上述提到了耗时任务需要改造,原先的方案是用 swoole 的 task 去处理耗时任务。而由于腾讯云函数的 PHP 环境支持 swoole,于是可以按照如下图所示进行改造:

但是该方案制造出来的进程不归自己管理,为了保险起见,可以引入腾讯云 消息队列 Ckafka

  1. 云函数封装了一个通用结构的消息体,发送至 Ckafka。
  2. Ckafka 可以触发另一个云函数(运行着耗时任务的代码)。

采用通用结构的好处是,可以忽略消息队列的主题,有任何需要异步操作的任务,只需写在被 Ckafka 触发的云函数里,然后发送要触发的名字和参数至 Ckafka 即可。如下图所示:

配置文件更新

这里的配置文件指的不是数据库配置之类比较小的内容。而是需要经常更新的大文本。例如聊天服务,通常会涉及到屏蔽词库,这类文件很大,而且更新较频繁。

对比 使用云函数之前 使用云函数之后
具体流程 1. 策划提交配置文件中的 git 库。
2. 执行 jenkins。
3. 由 jenkins 上传文件到 CVM,并进行 reload。
1. 策划提交 git。
2. jenkins 从 git 拿下来上传到 COS。
3. 云函数去 COS 拉取。

至此完成上述步骤,迁移过程基本完成。

迁移 Serverless 带来的优势

  • 无需维护 API 服务器,无需考虑 CPU 使用情况、内存使用情况,请求量增加也无需担心服务器资源不够的问题。
  • 监控内容详细,可以更好地查看整体的运行效率,是不是有慢请求,访问趋势,错误情况等。
  • 引入消息队列拆分后,解耦彻底,可以确保消息不会丢失,消息队列触发云函数的用法对于这种不断累积形式的慢任务,非常好用。
  • 版本管理出现问题,可随时切回版本。避免像之前一样,需要重新拉代码分支发布的情况。
目录