由于一些数据采集任务需要访问外网API接口,在服务器没有配置代理的情况下无法正常采集。同时,由于我买的服务器内存只有2G,服务部署多了以后服务器资源压力比较大。所以将一部分数据采集和Web接口服务迁移到腾讯云函数进行部署,使用了半年多以后感觉还是挺不错的。
腾讯云函数简介
优点
- 相较拓展服务器硬件资源,云函数价格更便宜;
- 可以实现国外节点部署,以便访问外网接口;
- 稳定可靠,有完善的任务调度及监控面板。
缺点
- 任务代码部署及后续更新相较更为麻烦;
- 每次调用都是临时分配环境资源,需要配合对象存储接口才能实现数据持久化,仅适合做数据中转处理。
计费方式
腾讯云函数采用如下三种指标进行综合计费:
- 调用次数:云函数的调用次数,其中事件函数Web函数分开计算;
- 运行资源:云函数运行期间所消耗的资源量,
- 出网流量:从腾讯云内网流出的流量。
对于新用户来说可以免费体验三个月。三个月之后开始付费使用,付费的方式有包月和资源包两种。对于个人用户来说最便宜的付费方案是购买40元一年期限的最低配个人标准包,包含100万次的事件函数调用次数、100万次的Web函数调用次数、50万GB·s资源量、2GB外网出流量。
从我历史的使用情况来看,目前部署了15个任务,每个月的函数调用次数在2000次左右,资源消耗量为300G左右,由于服务器和云函数节点都在腾讯云内网,运行数据采集任务不会使用外网出流量。因此,一年下来仅能使用资源包的2%左右,完全能应付未来的拓展需求,甚至感觉有点浪费。
任务部署
云函数本质是为你提供一个函数运行时环境,会在每次调用时分配资源,运行结束后销毁资源。因此部署任务时用户需要提供核心代码及相关依赖资源,并指定运行环境依赖。
本文以书单数据采集为例进行演示。
函数创建
在云函数控制台页面点击“函数服务”,然后选择部署节点的区服,然后点击创建新任务。对于国内部署的任务选择默认的上海节点即可,对于需要访问外网的任务可以选择新加坡节点。命名空间主要是为了方便大批量任务管理,可以保持不变。
函数基础设置
在函数创建界面选择“从头开始”。函数类型选择“事件函数”,该类型函数通过设定事件触发器进行调用,比如定时触发。“Web函数”用于部署Web应用程序,通过HTTP请求触发。
设定好函数名称和合适的运行环境,时区默认为“UTC”,建议修改为“Asia/Shanghai”。
函数代码文件上传
当代码文件比较少时可以使用在线的vscode编辑器进行代码上传。
需要注意的是,此处需要指定一个由文件名+函数名
构成的“执行方法”:NotionDBDA_BookList.main_handler
。并且该函数在实现上需要包含event
、context
两个参数。
1 | def main_handler(event, context): |
虽然此处可以对代码进行在线编辑上传,但是还不能安装环境依赖包。也可以选择在本地将源码和依赖打包好以后上传。
函数高级参数设置
在高级参数设置区域,可以将函数的内存资源改小以节省计算资源。
对于一些函数中请求和处理操作比较长的需要适当将执行超时时间调大,否则达到超时时间云函数会自动终止并等待一段时间后重试。反复失败三次以后会停止本次调用。
函数调度触发器设置
函数的调用触发器可以在函数创建时一并创建。
同一个函数可以具有多个不同类型的触发器,也可以同时配置多个触发器。
通常默认为定时触发,已经内置好了一些常用的触发周期选项,也可以自行设置。自定义触发周期的配置公式与crontab类似,不过参数个数为7位,因为控制的粒度细化到了秒级。但同时,也能兼容传统crontab 5位的周期公式。具体的配置方法可以参照官方文档。
函数环境依赖包安装
函数创建好以后进入函数配置界面,在“函数代码”页面可以再次看到在线的vscode编辑器,不过这次的功能更为完善。点击编辑器顶部的”终端>新终端”开始为云函数安装依赖包。
从左侧的文件树可以看到,我们的代码文件被放到了src文件夹下。由于目前看到的编辑器页面只是开发环境,并不是实际的运行环境,我们需要将依赖的python包也安装到src文件夹下一同打包部署。
在终端中执行命令安装相应依赖包:1
2cd src
pip3 install -t . xxx
首先需要进入src文件夹。注意此处一定要使用pip3
命令而不是pip
,否则会安装python2的依赖包。同时-t .
指定包的安装路径为当前文件夹。
如果遇到编辑器无法加载的情况,点击编辑器右下角“使用遇到问题>初始化编辑器”
部署与测试
在代码和环境依赖包都安装好以后,点击部署进行打包部署。系统将会把我们的代码和依赖文件都打包上传到腾讯云的对象存储服务器上以便调用时使用,如果是使用国外的节点,上传过程会相对慢一点。
部署完成以后点击“测试”按钮进行测试,下方会显示测试结果,如果显示“测试成功”则代表云函数能正常运行,整个云函数开发结束,之后仅需定期查看运行日志监控函数健康状态即可。