我啃了一周的腾讯云源码。
真的。
在周日的那个晚上,最终成功搞定了生产环境里的一个怪异的坑。到了凌晨3点时,老婆在卧室处于睡着的状态,而我坐在电脑前面发呆。就在那个时候,突然就有了想要把这些东西给写下来的想法。
不一定对。记录一下罢了。
将源码这件事,先讲明白,腾讯云SCF自身未开源,然而 的开源代码确实能够挖掘出内容。
.yml配置玄学
我踩的第一个坑。
刚接触的时候以为配置随便写的。
后来才发现。
看似呈现为简单模样的.yml,其背后隐匿着一整套关于资源编排的逻辑。腾讯云所具备的HTTP组件是立基于API网关加之Web Cloud 之上的,而其部署过程实际上是在协助你将/Koa这些传统框架进行打包,使其成为与云函数相兼容的形态。
多神奇啊。
你什么都不必去管,唯有一行sls 。底层究竟是如何达成在不改动传统框架的情况下,能够运行于无服务器环境之中的呢?
我以前一直觉得这是黑魔法。
多少行代码算优雅云函数?
这个其实问得不对。
我觉得。
但真实场景?
那会儿我写了个用于图片压缩的函数,将其加上依赖进行打包,结果函数包达到了二十多MB。当把它上传到SCF平台的时候,那种VPC网络无法穿透的感觉,直至如今回想起来都让人觉得后怕。
代码量不重要。重要的是你真正理解它在云端怎么跑起来。
冷启动问题到底解没解决
三天前朋友还问过这个。
我说,看场景。
瞧那源码里头 – scf组件展现出的设计逻辑,曾与竞品做过比较——实际上大家处理冷启动的方式大致是一样的。腾讯云所具备的优化之处在于:将能够预先设置的并发实例把控在100ms以下,在普通场景下则处于500ms到2秒的范围内。
但代价是什么?
假若你的业务对于延迟有着极其高度的敏感,就像金融交易这种情况,或许确实是不太适宜的。函数在被回收之后又重新被拉起来,那短短的几秒呈现出的“冰凉”状态,在用户体验方面相当于就是一场刷新遭遇失败。
关于开源的心态,我想说
最纠结的是这个。
好多人是出于要用的想法才去用的,我以往那个时候也是如此这般,老板提及说要进行上云操作,于是便急忙冲进去了。
真正啃源码之后才明白一个道理:
FaaS确实是简化了开发,你只管写代码,腾讯云管底层。
但这只解决了从0到1的问题。
从1到10?从10到100?
你得靠自身去寻觅解决办法,我曾阅览过遵循MIT协议的开源项目base – on ,它将礼品功能、应用管理以及单点登录均分割成了一个个彼此独立的云函数,其目录明晰简洁。
那一刻我明白了——
当系统复杂度呈现出爆炸态势的时候,你所需要用到的并非是更为高超的函数书写方式,而是更为聪慧的架构拆分手段。
环境变量和配置管理
踩坑最多的地方。
源码仓库里提醒过:所有敏感信息都放环境变量。
但在开发的阶段,存在着.env文件,在生产的阶段,有着VPC配置,还有不同地域节点的切换逻辑,而这些在源码当中,全部都是内嵌着的。
一回,将 ap – 写成了 ,部署得以成功,然而 API 网关却怎么也获取不到数据,经过长时间查找日志,才发觉居然是区域配置不相匹配。
那一刻真想砸电脑。
单并发处理的取舍
SCF源码设计思想上,一个并发实例同时只处理一个事件。
这保证了稳定性和数据一致性。
这表明你单个的函数逻辑不应太过繁重,如果每当遇到一个请求它都得运行十几秒,那么你的并发能力就等同于零,根本毫无办法充分施展弹性扩展所具备的优势呢。
在编写函数之际,会存在一种分裂的感觉,一方面,不能因为惧怕冷启动,就使得函数留存过长时间,另一方面,又不敢让函数太过简单粗陋以至于无法应对复杂的业务情况。
不是没有服务器
这句话跟朋友重复过无数遍。
每次对方都说“懂了”。
但从源码角度来看,腾讯云在后台帮你做了太多事情。
比如说啊,触发器的设计方面,像COS对象上传事件、定时任务以及小程序调用这些情况,SCF它都能够进行捕获。
发生这样的状况,致使我回想到刚踏入工作岗位的那段时期,那时老板老是讲需要领会“底层原理”,而我在那个时候认为他是在故作姿态。
现在才懂。
HTTP适配到底改了啥
瞧,在scf–demo的源码当中哦,出现了这样一种情况呢,存在着一个操作,它是调用(app),通过这个操作,达成了把传统的监听端口模式做相应改造,使其转变为事件驱动的这般结果。
看懂这个的时候。
我盯着屏幕愣了十分钟。
实际上,框架所充当的,乃是一个具备强大功能的适配器的角色,将HTTP的世界与函数的世界连接在一起,使其相互融合。
关于组件的复读机和创新派
有些人复制粘贴现成的组件代码。
有些人基于做二次开发。
都可以。
但我开始认同一个说法:少即是多。
不必什么都往云函数里塞。先把核心逻辑切干净。
SCF的资源调度到底能撑多大
SCF的并发扩缩容逻辑是这样的,当请求来临的时候,不存在空闲实例这一情况,就会自动去启动新的。
每个区域默认500实例/分钟的扩容速度。
这是写死在底层设计的,你改不了。
若你的业务突然间流量超出这般阈值,便会碰到429 错误。
所以别神话能无限扩展。
它不是万能的。
坦白说,我还在摸索
啃一周源码远谈不上精通。
此时回想起那些通宵达旦进行调试的夜晚,反倒发觉那时的自身最为真切。一旦代码出现问题便会崩溃,要是查不出缘由就想要骂人。然而在解决bug的那个瞬间,整个云函数的执行链路就在心中明晰起来了。
那种感知。
比任何文档都直观。
此刻,我依旧在持续不断挖掘源码的行动之中,接下来所要达成的目标乃是,将层Layer(把那些不怎么会出现变更情况的依赖包单独处理予以分离出来)的切实压缩机制以及运行时挂载原理弄明白。
写完了。
凌晨3点半。
希望对你有用。
倘若你同样在钻研这块来源代码的时候,碰到了某些稀奇古怪的状况,不要对此怀疑自身。它打从一开始就是如此这般被悉心设计得颇具深度的。

