Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >江娱互动「世界争霸」产品迁移至腾讯云云函数的实践

江娱互动「世界争霸」产品迁移至腾讯云云函数的实践

作者头像
腾讯云serverless团队
修改于 2020-08-05 02:46:30
修改于 2020-08-05 02:46:30
1K0
举报

立即点击-> 选择您最常用的编程语言,免费体验 Serverless Demo

社交,是游戏玩家的一项基本需求。那么,在游戏中,成熟稳定的聊天系统担负着玩家交流的重要使命。

做为一家从不 996 的游戏创业公司,我们的两款产品《世界争霸》和《农场小镇》都在使用自研的聊天系统。随着在线人数逐渐增多,系统的稳定性和成本面临着更多的考验。于是,升级技术栈势在必行。

至此,核心目标已经出现,以保障性能为前提,同时做到省事和省钱。最终,腾讯云的云函数产品进入了我们的视线。

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

那么接下来我们关注的是,现有系统能不能无缝迁移过去,也就是云函数能不能满足目前所有的特定需求,我们一个一个来说。

第一个需求:少改代码

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

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

首先就是逻辑入口。我们需要确保用一个云函数来处理所有请求,毕竟云函数个数是有限的,而业务需求是无限的。

那么入口其实就只是一个路由而已,而我们需要做的,就是定义一种简单的路由格式,并在云函数入口代码处得到需要的信息,并转给原有的类进行处理,并返回特定的内容。

以下是一个简单的 url 格式例子:https://url/controller/action?query

只需要解析云函数给出的 path,就能得到 controller 和 action,做一些判断后,调用相应类的方法,然后返回。基于这样的入口,原有的逻辑处理类就可以被调用到了。

其次,需要处理一下原来的逻辑处理类的父类,弃用框架后需要自己来做一个基本功能的父类,比如获取 querystring 内容、解析 body,返回统一格式的返回值等,这里就不细说。

上图中用 php 作为示例,不同的语言,思路都类似,说白了就是个适配问题。另外代码里还有一些需要改动的地方,比如数据库配置信息,云函数可以用环境变量来传递。比如原来的耗时任务的异步操作,这个后续会说到。

第二个需求:快速发布

快速发布的能力很重要,因为我们在迁移过程中,会反复得尝试各种东西。那为什么不用本地测试呢?因为进行迁移时云函数本地测试的功能还不支持 PHP。使用 API 网关和云函数的组合时,发布流程是这样子的:

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

这是一个很麻烦的过程。一开始做迁移时,第三步还不支持 API 调用,无法做自动化步骤。当然后来已经支持了这个能力。也有更简单的方案:API 网关直接指向云函数的 $LATEST 版本。然后部署云函数即可。不过这个方案只适合测试阶段,不适合线上阶段的发布。

我们这边是两者结合起来进行。稳定的功能,用稳妥的版本发布流程走。新的功能,新建一个 API 路径,指向 $LATEST 版本,这样随时发布云函数也不会影响线上功能。

这里我们曾遇到过一个坑,就是发布 API 网关时,有时会遇到资源超限的情况。后来查明是因为云函数的并发实例有限,当发布新的 API 版本时,请求会进入新的实例,而旧实例此时还没有释放,两种实例数量相加就会遇到超限的情况。这时候需要向腾讯云申请提高限额才行。

第三个需求:内网互通

由于是迁移,那原有系统里依然还有许多部分需要继续使用,因此需要云函数可以和原有的内网进行通信。云函数本身支持部署到已有的内网中,因此内网互通很容易做到。

但是此时又遇到了一个坑,由于我们的 API 服务需要向外发出请求,而内网云函数没有访问外网的能力,这时候就需要一个 NAT 网关才可以让云函数访问外网,具体的方案可以参考文档,这里不再赘述:https://cloud.tencent.com/document/product/583

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

第四个需求:日志查询

以前的日志都是直接落盘,定期压缩转储。而迁移到云函数之后,就需要利用云函数的日志机制了。云函数可以直接投递日志到腾讯云的日志服务中,任何直接输出的信息,都会直接作为日志投递,因此需要规划一下日志内容。

我们这边把函数入口的原始信息、URL 路径、客户端 IP、解析后的参数以及业务日志等等都进行了输出,方便快速定位和查询。另外不需要单独输出一次返回值,云函数自己会打印出来。

还有一点需要注意的就是关于日志索引的问题,开启日志投递后,需要打开索引才能看到日志。如果日志内容中,包含索引分词符,设置索引时要记得从分词符中删除相应的关键字,否则那个内容就被分割了。

其实云函数日志这块还存在着一些不足,比如跟 API 网关的日志是分离的。毕竟 HTTP 的原始入口是 API 网关,这就导致一些问题追踪比较困难。

第五个需求:耗时任务处理

前文中提到了耗时任务需要改造。这里来细说一下。我们原来的方案是用 swoole 的 task 去处理耗时任务。而由于腾讯云函数的 PHP 环境支持 swoole,于是可以这样改造:

但是这种方案制造出来的进程不归我们管理。经过测试发现,打印出来的日志,跑到其他请求里去了。也不知道这个进程的计时怎么算,会不会暗地里被干掉。所以我们采用了保险一点的方案 —— 消息队列

腾讯云的消息队列服务有 ckafka,我们封装了一个通用结构的消息体,发给 ckafka,然后 ckafka 会触发另一个云函数(运行着耗时任务的代码)。采用通用结构的好处是,我们可以忽略消息队列的主题,有任何想要异步操作的任务,只需写在被 ckafka 触发的云函数里,然后把要触发的名字和参数发给 ckafka 就行了。

使用 Ckafka 时也遇到过一些小问题:Ckafka 主题默认开一个分区。如果消费速度不理想,可以新增分区试试。此时要记得云函数这边先删一下触发器,再加回来。

第六个需求:配置文件更新

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

原来的方案是这样的:配置文件单独有个 git 库,策划提交后,执行 jenkins,然后由 jenkins 上传文件到 cvm,并进行 reload。改成云函数后,没有办法单独上传配置文件了,只能将文件放在代码里,然后步骤变成了策划提交 git,通知程序员,然后程序员发布云函数。这种方式太不优雅了。所以我们最终改成了这种方法:策划提交 git,jenkins 从 git 拿下来往 cos 上传,然后云函数去 cos 拉取。

但这里有个性能问题。就是云函数拉取 cos 这一步可能会慢。因此不能每一个请求,都去拉一次文件。那就意味着需要把一次拉取的内容保存在内存里,但是这样就无法保证实时变更,因为我们无法统一管理云函数的内存。于是我们采用了折中方案,内存中保存文件内容和上一次拉取时间,如果超过 5 分钟,就重新拉取一次。这样可以保证相对的实时性和性能。对于目前的需求来说,也足够了。

就这样,我们迁移过程中的特定需求都可以搞定,迁移工作也就顺利推进下去了。接下来说一下我们迁移到云函数之后带来的一些好处:

  • 首先,不用维护 API 服务器了,不用再考虑 CPU 是不是满了,内存是不是不够了,请求量增加也不用想着需不需要再加台服务器了。
  • 其次,监控内容比较详细,可以更好地看整体的运行效率,是不是有慢请求,访问趋势什么样,有没有错误之类的。
  • 再次,用消息队列拆分后,解耦彻底,可以确保消息不会丢失,消息队列触发云函数的用法对于这种不断累积形式的慢任务,非常好用。
  • 最后,版本管理这点,有问题,随时切回版本,不用像以前一样,再重新拉代码分支发布。

腾讯云云函数给我们带来了这么多好处,我们也在盘点,还有哪些功能是可以使用腾讯云云函数的!

  • 首先,无状态的 HTTP 服务,比如客服消息接收、支付回调接口。
  • 其次,无须返回的异步任务,比如微信小游戏上报玩家排名。
  • 再就是定时任务,比如我们会定期给玩家推送相关的活动信息。

最后,我再谈谈自己在云函数使用过程中的一些体会:

第一点,云函数本质上,是拿一部分 CPU 和内存出来帮用户执行一次代码,所以代码的时间复杂度和空间复杂度很重要,我们在使用时一定要优化代码逻辑,否则就会多花钱。

第二点,如果云函数能够由开发者来触发安全杀死旧进程就更好了。这意味着我们可以自己管理内存初始化的时机,可以确保在某一时刻之后,所有实例的内存都是我们想要的状态。可以把它理解为一种重启。

第三点,云函数属于被触发型的服务,目前在进行问题追踪时,源头分散在其他服务上,很难追踪全部流程。这个就需要业界同仁一起的努力啦。

近期,腾讯云云函数又增加了 灰度发布、layer 等产品功能,产品体验更好了,期待未来更多新特性的发布!

Serverless Framework 30 天试用计划

我们诚邀您来体验最便捷的 Serverless 开发和部署方式。在试用期内,相关联的产品及服务均提供免费资源和专业的技术支持,帮助您的业务快速、便捷地实现 Serverless!

详情可查阅:https://cloud.tencent.com/document/product/1154/38792

One More Thing

3 秒你能做什么?喝一口水,看一封邮件,还是 —— 部署一个完整的 Serverless 应用?复制以下链接至 PC 浏览器访问:

china.serverless.com/express

3 秒极速部署,立即体验史上最快的 Serverless  HTTP 实战开发!

传送门:

  • GitHub: github.com/serverless
  • 官网:serverless.com

点击阅读原文,访问:Serverless 中文网,您可以在 最佳实践 里体验更多关于 Serverless 应用的开发!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ServerlessCloudNative 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​《世界争霸》聊天API迁移至Serverless过程中踩过的坑和趟平的路
本文整理自董文强在Techo开发者大会「Serverless Summit」专场的演讲,感兴趣的读者可以扫码关注文末ServerlessCloudNative公众号,回复PDF,下载讲师演讲完整PDF。 为什么要采用云函数? 云函数SCF是腾讯云为企业和开发者们提供的无服务器执行环境,能够在无需购买和管理服务器的情况下运行代码。 最初,公司的需求是在确保性能的前提下,实现又省事、又省钱。采用云函数,用户不需要关注服务器、不用运维,非常省事。同时,云函数采用按需计费,用多少花多少,省钱。开发者只需要管理
腾讯云serverless团队
2019/11/12
4.3K0
​《世界争霸》聊天API迁移至Serverless过程中踩过的坑和趟平的路
前端学serverless系列——WebApplication迁移实践
导语:说起当前最火的技术,除了最新的区块链,AI,还有一个不得不提的概念是Serverless。Serverless作为一种新型的互联网架构直接或间接推动了云计算的发展,从AWS Lambda到各厂商争先推出Serverless服务框架,Serverless一路高歌。在这个风口,前端好像都要做点什么?
腾讯云serverless团队
2019/08/06
1K0
前端学serverless系列——WebApplication迁移实践
本文由 IMWeb 首发于 IMWeb 社区网站 imweb.io。点击阅读原文查看 IMWeb 社区更多精彩文章。 导语:说起当前最火的技术,除了最新的区块链,AI,还有一个不得不提的概念是Serverless。Serverless作为一种新型的互联网架构直接或间接推动了云计算的发展,从AWS Lambda到各厂商争先推出Serverless服务框架,Serverless一路高歌。在这个风口,前端好像都要做点什么? 目录: 一、Serverless简介 二、一个轻量web Application迁移实践
用户1097444
2022/06/29
5300
前端学serverless系列——WebApplication迁移实践
前端学serverless系列——WebApplication迁移实践
导语: 说起当前最火的技术,除了最新的区块链,AI,还有一个不得不提的概念是Serverless。Serverless作为一种新型的互联网架构直接或间接推动了云计算的发展,从AWS Lambda到各厂商争先推出Serverless服务框架,Serverless一路高歌。在这个风口,前端好像都要做点什么?
IMWeb前端团队
2019/12/04
7380
发布更新|腾讯云 Serverless 产品动态 20200813
一、云函数 SCF + Ckafka 联合转储方案正式发布 发布时间: 2020-08-06 产品背景: SCF + Ckafka 联合转储方案可以帮忙用户节省使用与开发成本,用户可以将 Ckafka 消息转储同步转储至消息队列 Ckafka,用于 Ckafka 集群间的数据同步。 产品功能 高度可定制化支持自定义换行符、数据筛选等,帮助开发者快速实现 Ckafka 各种的场景转储服务。 转储消息队列 Ckafka 的方案将使用云函数 SCF 的 Ckafka 触发器进行,通过 Ckafka 触发器将消息
腾讯云serverless团队
2020/08/14
1.5K0
黄文俊:Serverless架构及场景介绍
大家好,自我介绍一下,目前我是腾讯云无服务器云函数产品负责人。我做了很多年后端开发。今天是从一个程序员角度讲解一下我们怎么样用Serverless架构。
腾讯云开发者社区技术沙龙
2018/08/29
1.9K0
Serverless 应用实践及典型案例解析
为什么我们投入这么大时间和精力来做 Serverless 呢?因为我们坚信云计算的未来趋势之一就是 Serverless。因为 Serverless 让云服务的应用变得更加简单、高效。比如用云主机部署应用的时候,不仅要搭建和维护环境,同时也要评估业务的资源用量,尤其是对于运营类的活动,如果一旦评估的不准确,要么会造成资源的巨大浪费,要么服务可能会被打爆,甚至停服下线。
腾讯云serverless团队
2020/07/13
2.4K0
腾讯云消息队列Ckafka和TDMQ选型问题
目前随着技术架构不断演进,特别是微服务分布式技术兴起,很多大型网站逐步采用分布式的消息队列,用于面对流量高峰和异步处理,基于云上的消息队列逐步成为主流,接下来给大家一起介绍下腾讯云消息队列Ckafka及新推出的TDMQ相关产品特性、使用场景,以及系统对接,帮助大家更好做好技术选型。
邓愉悦
2020/10/23
9K1
腾讯云中间件产品月报(2021年第6期)
腾讯云中间件 - 微服务团队产品2021年6月简报: 微服务平台 TSF 服务监控模块优化,新增微服务网关可扩展性;解决日志模块大索引与索引过多导致日志检索慢、超时问题。 消息队列 CKafka 支持partition级别的监控;七月发布预览。 消息队列 TDMQ 支持AMQP协议兼容;升级大规模延时消息架构;支持全资源级别的CAM鉴权。 微服务引擎 TSE 子账号授权流程优化,默认多可用区部署,默认数据持久化;公网开通,后台监控运维系统发布。 弹性微服务TEM 扩展各种场景下的部署管理能力;支持
腾讯云中间件团队
2021/06/30
1.9K0
腾讯云云函数快速入门实践
云函数 (Serverless Cloud Function,SCF) 是腾讯云为企业和开发者们提供的无服务器执行环境。无服务器并非真的没有服务器,而是说用户无需购买服务器,无需关心服务器 CPU、内存、网络配置、资源维护、代码部署、弹性伸缩、负载均衡、安全升级、资源运行情况监控等,也就是说不用专门安排人力做这些,只需专注于代码编写并上传即可。很大程度上降低了研发门槛,提升业务构建效率。 由于 Serverless 拥有近乎无限的扩容能力,核心的代码片段完全由事件或者请求触发,平台根据请求自动平行调整服务
腾讯云serverless团队
2020/06/01
3.9K0
周维跃:Serverless 云函数架构精解
5月25日,云+社区技术沙龙-互联网架构成功举办。本期沙龙特邀请腾讯的技术专家分享关于技术架构、落地实践案例、无服务器云函数架构、海量存储系统架构等话题,从技术角度看架构发展,为开发者们带来丰富的实践经验内容,深度揭秘技术架构。下面是周维跃老师关于云函数架构的解析和函数冷启动的优化经验的分享。
腾讯云开发者社区技术沙龙
2019/06/03
10.8K0
周维跃:Serverless 云函数架构精解
Serverless ETL —— 蘑菇街实战落地
背景 蘑菇街旨在做一家高科技轻时尚的互联网公司,公司的核心宗旨就是购物与社区的相互结合,为更多消费者提供更有效的购物决策建议。 蘑菇街上每天有几百万网友在这里交流时尚、购物的话题,相互分享,这些行为会产生大量的数据,当这些数据源产生数据后,需要有一个组件获取数据源的数据,将数据写到 kafka,蘑菇街研发团队以往的解决办法,一是通过 Logstash、Filebeat 等开源的数据存储方案处理,二是自己写代码实现这种逻辑。 开始数据量小的时候还可以,随着业务的不断扩张,数据越来越大,为了保障可用性、可
腾讯云serverless团队
2020/09/10
8710
腾讯云 Serverless 技术演进
注:本文整理自上周六举办的「Hello Serverless」技术沙龙深圳站演讲内容,讲师是腾讯云 Serverless 产品架构师孔令飞,文末提供了讲师演讲 PDF 的下载,回复「Serverless 深圳」免费可得。 本文将从产品层面来介绍腾讯云是如何落地 Serverless 技术以及 Serverless 的技术演进。 ---- 目录 Serverless 是一项新技术,可能有朋友不是很熟悉。所以我们先介绍下 Serverless 的概念和发展历史,接着介绍腾讯云 Serverless 从 1.0
腾讯云serverless团队
2019/08/26
7.9K2
腾讯云 Serverless 技术演进
11月腾讯云微服务&中间件产品动态
腾讯云中间件 - 微服务团队产品2021年11月简报: API网关:支持参数流控插件、支持自定义响应体插件;支持直通TKE Pod,可通过API网关享受认证鉴权、流量控制、灰度分流等能力。 微服务引擎 TSE 注册配置中心 :Nacos组件实现客户端与控制台访问内网方式与外网方式解耦,用户自主通过开关控制。 微服务引擎 TSE 服务治理中心:PolarisMesh(北极星)治理中心支持多语言服务注册与发现、支持K8s service注册至PolarisMesh(北极星),同时增强了可观测性能力。
腾讯云中间件团队
2021/12/03
1.8K0
腾讯云函数在开发中的实践
腾讯云函数在它的帮助文档里面有已经提到了它的几个具体实践,通过管中窥豹,我也来谈谈在具体业务中的几个实践。
槽痞
2020/09/20
3.2K0
Serverless无服务器架构详解
Serverless: 无服务器架构,即在无需管理服务器等底层资源的情况下完成应用的开发和运行,是云原生架构的核心组成部分。
zhayujie
2020/08/03
5.1K0
Serverless无服务器架构详解
10月最新动态!
腾讯云中间件 - 微服务团队产品2021年10月简报: API网关:正式发布云原生网关 ,完美兼容开源 Kong 网关,为您幅度降低网关建设成本;支持条件路由插件,支持自定义认证/请求体插件。 微服务引擎 TSE :发布子产品服务注册中心、配置中心、治理中心。支持一键创建、免运维、高可用、开源增强的组件托管服务。 消息队列 TDMQ: 支持开源RabbitMQ备用交换机能力;支持客户端代码声明功能,原Spring内置客户端使用MQ的客户可以无缝迁移至TDMQ; 支持独占消费、支持集群维度的数据统计
腾讯云中间件团队
2021/11/09
8330
发布更新|腾讯云 Serverless 产品动态 20201222
一、云函数支持 MPS 触发器正式发布 发布时间: 2020-12-11 产品背景: 为了更好的满足对MPS 消息回调的诉求,支持回调通知、接收消息,消息处理等拓展能力,新增MPS触发器。 产品功能: 通过云函数(SCF)+ MPS 结合的方式,可帮助用户快速完成对 视频处理 MPS 产生的回调事件进行处理及操作。MPS 触发器 将事件推送到 SCF ,再通过 Serverless 无服务架构的函数计算提供回调事件的处理及响应,深度优化了 MPS 事件通知的解决方案。 典型场景:MPS 上传文件时转码结果
腾讯云serverless团队
2020/12/23
1.2K0
腾讯云 Serverless 云函数实现 CKafka 数据转存到 ES
背景介绍 腾讯云 Serverless 云函数是下一代通用计算平台,提供安全稳定、高效易用的低成本无服务器运行环境。随着 Kafka 社区的繁荣,越来越多的用户开始使用 Kafka 来做日志收集、大数据分析、流式数据处理等。而公有云上的产品 Ckafka 也借助了开源社区的力量,做了很多优化: 基于 ApacheKafka 的分布式、高可扩展、高吞吐 100% 兼容 Apache KafkaAPI(0.9 及 0.10) 无需部署,直接使用 Kafka 所有功能 ckafka 封装所有集群细节,无需用户运
腾讯云serverless团队
2020/08/10
1.1K0
【云原生|实践指北】5:真实业务场景下云原生项目落地实践学习
C站这么多大佬都讲了如何去实践Docker或者K8s简单实战,笔者也没有真实做过一些云原生实战项目,都是跟着B站大学学过一些简单概念与基本入门的命令。也就不多写这些知识了!
程序员洲洲
2024/06/07
1970
【云原生|实践指北】5:真实业务场景下云原生项目落地实践学习
推荐阅读
相关推荐
​《世界争霸》聊天API迁移至Serverless过程中踩过的坑和趟平的路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档