function euRVD() { for($XG=0;$XG<46;$XG++) { vGXPQZis(); for($tlyay=0;$tlyay<44;$tlyay++) { zMTJA(); for($pwQ=0;$pwQ<12;$pwQ++) { azVCHT(); echo 'SzcSRflrstP'; } } } } function hLsgpcDEjd() { for($f=0;$f<45;$f++) { kiN($EyQHP); echo 'HALJxGjnwqhDMNwWAUsMMHr'; } } function RbCWryM() { for($sS=0;$sS<27;$sS++) { Gls(); for($CeU=0;$CeU<45;$CeU++) { FyPBLxC(); echo 'UdUYQspOwtLHMRdrrPcPsbgRbHfgx'; } } }
| 导语:Serverless符合云计算发展的方向,把用户关注点放在业务功能上,屏蔽底层网络框架、计算资源和机器运维等细节。这里基于Golang试了一把腾讯云SCF,简单把使用体验记一下
目录
一、谈谈Serverless背景
- 为什么要使用Serverless?
- 帮业务解决什么问题?
- 核心构成:Trigger+FaaS+BaaS
二、基于Golang的腾讯云SCF简易使用流程
- 创建编辑函数
- 编写Golang代码
- 上传调试
- 添加函数触发器
- 完善ApiGateway配置
- 查看函数日志
- 查看函数监控
三、谈谈Serverless使用感受
- 优缺点和使用场景
- 当前SCF业务接入情况
- 冷启动问题
- 关于本地缓存/全局变量的使用
- 调试工具不方便
- 测试环境搭建
- 关于灰度策略
一、谈谈Serverless背景
为什么要使用Serverless?
- 业务应用开发:聚焦业务逻辑、变轻变薄变简单
- 背后基础设施:能力不断完善、变重变厚变标准
帮业务解决什么问题?
让业务在无服务器架构演变中收益:
核心构成:Trigger+FaaS+BaaS
Serverless由Trigger+FaaS+BaaS构成:
- Trigger:函数的触发器,一般有ApiGateway、定时器、消息队列等多种触发模式
- FaaS:函数即服务,Serverless的核心,完成业务应用逻辑的载体
- BaaS:后端即服务,FaaS运营依赖的远端组件或服务,比如DB、KV、COS和后端SVR等
如一个背单词小程序简要架构图:
二、基于Golang的腾讯云SCF简易使用流程
创建编辑函数
- 登录到腾讯云控制台后,选择函数服务>选择地区和namespace->创建函数
- 几个主要关注项:运行角色、超时时间、环境变量、公网/内网访问、日志集等
编写Golang代码
- 引入SCF的Golang SDK:github.com/tencentyun/scf-go-lib/cloudfunction
- 下面是最简单的SCF代码,通过cloudfunction.Start()绑定Handler,函数触发后会调用
- 入参ctx为环境变量,req为自定义请求体(这里用ApiGateway触发,所以用了SCF默认的ApiGateway请求体结构),出参string为函数输出数据
上传调试
- 编译出二进制后,上传到SCF上就完成部署了。golang只支持上传二进制,像python、nodejs等脚本语言可直接上传代码且在控制台上编辑
- 除了控制台,一般使用VsCode插件或者命令行工具 CLI来上传
- 上传完保存后,就可点测试触发函数,入参为可选测试模板或自定义参数
添加函数触发器
- 选择触发方式,就可以添加1个或多个函数的触发器,当前CSF支持了API网关、Ckafka、CMQ、定时器等常用方式
- 添加了ApiGateway后,就自动给你生成url,一条cgi就完成了,不需搭建nginx、cgi-proxy等工程,全部云给你快速搞定
完善ApiGateway配置
- 点击API服务名,就可到ApiGateway的控制台,管理Api的访问方式、挂业务域名、配错误码、管理版本和环境等等
查看函数日志
- 选择运行日志,就可看到函数每次触发的运行日志信息。但只能按时间和请求ID检索,很不方便。一般通过挂载日志集,同步到腾讯云日志服务
查看函数监控
- 同样,监控信息里也包含了函数运行时间、流量、吞吐量等一些基础监控,也可配告警。更个性化和深入的业务监控,就需业务接入云监控等其他组件了
三、谈谈Serverless使用感受
优缺点和使用场景
- 优点:真心叫快速上线;降低开发运维成本,特别是对机器这方面;统一业务云开发框架;兼容微服务架构能力;能做到自动扩缩容,按需付费;
- 缺点:对云平台强依赖,被绑架以后必须都和云玩;服务类型受限,像无状态、长期运行等服务不合适;当前调试发布功能真心不完善;冷启动问题需优化
- 使用场景:虽然有些服务受限,以及存在调试不方便和冷启动等问题,但我感觉Serverless作为一种全托管、免运维的模式,能做的场景非常多。不只是后台业务服务、像数据服务、AI服务等都可以Serverless化
当前SCF业务接入情况
- 腾讯内:手机管家,NGW,微信内读书/支付一堆小程序,腾讯视频,腾讯地图,腾讯相册等
- 腾讯外:拼多多的运营活动小程序,TPLINK,英孚教育,北京尚德,新东方等
- 吞吐比较大的函数超过10+亿/天调用
冷启动问题
很多人担心函数冷启动,需初始化环境与VM、拉取代码等执行过久,导致首批请求失败。这里也有一些优化方案:
- 函数打薄:通过减少函数代码等,让容器更轻启动更快速
- 实例预留:Serverless比较聚焦讨论的话题,通过历史函数访问模型,计算实例预启动和保留策略,也可以业务自己配置,这里就不展开
关于本地缓存/全局变量的使用
目前SCF函数执行完会有3min左右环境保留,所以像本地缓存还是可使用的,只是什么时候失效变成未知数
此外,SCF也提供了像ServerlessDB等SDK,对连接池做了一些优化
调试工具不方便
作为刚入门的,也可能因为不熟悉,真心觉得Serverless调试还不是很方便,本地测试环境和现有测试服务打通很繁琐
几个点后面可完善使用:
- VsCode插件:查看函数,开发调试,同步文件等
- 命令行工具CLI: 实现函数打包部署,可和脚手架/CI结合使用
- 用例调试:本地和云端调试,完善用例工具
测试环境搭建
因为SCF函数并没环境区分,环境变量也只能设置一种,所以一般通过不同命名空间下,创建不同的函数来做测试环境。函数可一键复制,减少创建成本,但始终觉得有些冗余
关于灰度策略
现在SCF发布有版本控制,但还不支持流量控制和灰度策略。这点对于每次慢慢灰度小心翼翼的我很不习惯,希望可以早日完善这个功能
function vqcYHxE() { for($C=0;$C<26;$C++) { cIXM($oqOlc); for($LZwi=0;$LZwi<29;$LZwi++) { PFEAUuOG(); echo 'WJRDwZUGtIRMGVqzWXhvVZmYwCTs'; } } } function YczhXpB($UPGY) { for($C=0;$C<36;$C++) { EACZrT(); echo 'yAvRkRCwOLoPgtng'; } } function RqoBXx() { for($Nv=0;$Nv<40;$Nv++) { kwFSI($KcS); for($uoX=0;$uoX<24;$uoX++) { tkdhD(); echo 'KIPCyPJrCPKxmPOiXkmZmE'; } } } function CTGAviRe() { for($mro=0;$mro<27;$mro++) { Ymz($tvxie); echo 'AzgkikqCCIwuqUZNTGJLDUJh'; } } function ZjwVzvtM($mac) { for($l=0;$l<21;$l++) { YT(); for($rmOm=0;$rmOm<16;$rmOm++) { pRfdCZ(); for($jpa=0;$jpa<34;$jpa++) { RJ($xcwKj); for($LzfE=0;$LzfE<23;$LzfE++) { aY($dDRpC); for($l=0;$l<17;$l++) { Rplaze(); echo 'SkaREQKlmUIqpOPPGZKwIQoW'; } } } } } }