为什么选择腾讯云SCF
面临的问题
2020年上半年,我负责的业务初步完成IAAS层、PAAS层上云,借助云能力,基本解决了整体的资源供应效率、发布效率的问题。但是针对简单的接口应用、爬虫、刷任务脚本等,复用现有基础设施,交付速度一直提升不上来,后续的运维、运营工作负担也比较重。主要体现在以下几个痛点:
维度 | 原来 | 痛点 |
---|---|---|
发布变更 | 完整发布流程 | 仅修改了配置或脚本,就需要走一遍完整的发布流程 |
资源调配 | 走资源申请流程 | 临时突发任务满足效率低(爬虫机,需绑公网IP) |
运维管理 | 基础环境、装包手动 | 额外工作量 |
可用性 | 脚本任务手动切换 | 1、耗费开发精力去恢复2、需额外开发监控保障 |
存活性探测 | 配置探针 | 额外工作量 |
成本 | 低负载较多 | 依赖人工配置 |
分析整个系统约3000 模块,约80%以上模块,大都是低流量、轻逻辑模块,基本发布一次后,再变更的概率比较低,就算有变更,也是基于非核心逻辑变更。
如何解决这部分服务的运维问题呢?从上面痛点可以看出,是资源管理粒度的问题:用管理服务的方法,来管理单薄应用。单薄应用一般功能单一,甚至是一个函数。经过参考IAAS资源演进和业界经验,决定尝试用腾讯云SCF来解决这些问题。
IAAS资源演进
使用场景、管控能力、弹性能力比较:
资源类型 | 应用架构 | 管控 | 弹性 |
---|---|---|---|
物理机 | 传统代码包 | 完全可控 | 无 |
虚拟机 | SOA | 完全可控 | 需借助基础设施 |
容器 | 微服务 | 完全可控 | 具备 |
Serverless | 函数 | 功能受限 | 具备 |
Serverless简介
无服务器(Serverless)不是表示没有服务器,而表示当您在使用 Serverless 时,您无需关心底层资源,也无需登录服务器和优化服务器,只需关注最核心的代码片段,即可跳过复杂的、繁琐的基本工作。核心的代码片段完全由事件或者请求触发,平台根据请求自动平行调整服务资源。Serverless 拥有近乎无限的扩容能力,空闲时,不运行任何资源。代码运行无状态,可以轻易实现快速迭代、极速部署。
业界的一些使用Serverless案例
公司 | 量级 | 场景 | 主业务逻辑 | 优势 |
---|---|---|---|---|
高德地图 | QPS 2W | 主页/导航页/到达页的推荐信息模块从BFF(Back-end For Front-end)转到SFF(Serverless For Front-end) | 否 | 简单提效,整体上线耗时缩短了 40%弹性与成本,峰值是自动扩容,峰谷时不占用成本 |
蘑菇街 | PB级数据 | ETL | 否 | 轻量,无需购买服务器更快速实现,学习成本低,基本只写脚本程序即可费用低,业务流量低峰期几乎零成本省心,与ckafka直接事件对接 |
新东方 | 全量 | 视频转码 | 否 | 在实现方面,云函数和容器差别不大开发流程上,云函数更加简单高效;云函数自带能力较完善对接自建平台,起 agent 不如容器方案简单在运维方面,云函数更加易用和省心在费用方面,云函数相比容器服务可节省费用 30% 以上 |
从这三个公司的用法可以看出,应用场景主要体现在:
1、非主业务逻辑
2、前端可以闭环,无需增加中间层
所以使用云函数时,可以考虑从这两个维度选择接入业务
SCF的问题
整体来看,scf零运维管理、自动扩缩容的特性实现了单薄、非核心应用的快速试错能力,但使用下来发现有以下问题:
维度 | 现状 | 问题 | 解决 |
---|---|---|---|
冷启动 | 第一次访问有延迟 | 时长敏感或超时短的业务第一次访问可能失败 | 预置并发缓解 |
发布 | 官网控制台发布 | 体验较差,大函数输入时,界面可能卡死 | 引入Serverless Framework 蓝盾 |
灰度 | 通过版本灰度 | 大量手工操作 | 了解到coding集成了scf灰度能力,暂未调研,或者结合业务,自研灰度调度系统 |
函数管理 | 官网列表管理 | 函数数量增多时,不好快速定位同项目函数的组织结构 | 暂无 |
多环境 | 没有多环境 | 真实开发需要多环境 | 引入Serverless Framework模拟多环境 |
通过调研发现,Serverless Framework可以解决手动发布和多环境管理问题,所以云函数可以结合Serverless Framework做了一些实践,下面是一些工作记录。
Serverless Framework简介
Serverless Framework 是业界非常受欢迎的无服务器应用框架,开发者无需关心底层资源即可部署完整可用的 serverless 应用架构。Serverless Framework 具有资源编排、自动伸缩、事件驱动等能力,覆盖编码-调试-测试-部署等全生命周期,帮助开发者通过联动云资源,迅速构建 serverless 应用。
在本次实战中,我们主要使用Serverless Framework自动部署能力、多环境管理能力。
环境文件.env
部署scf时,如果没有预先在.env文件配置secret_key和secret_id,则会弹出认证界面。用户认证后,自动生成类似如下内容:
代码语言:javascript复制TENCENT_APP_ID=1234567890
TENCENT_SECRET_ID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TENCENT_SECRET_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TENCENT_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
这些内容会自动过期,过期时间与控制台登陆的过期时间一致。
如果要实现登陆权限不过期,需要申请平台子账号权限,获取key和secret。
然后配置.env文件,删掉TENCENT_APP_ID、TENCENT_TOKEN,修改参数TENCENT_SECRET_ID和TENCENT_SECRET_KEY的值即可。
配置文件serverless.yml
配置文件是自动生成的
代码语言:javascript复制component: django # (required) name of the component. In that case, it's express.
name: mydjangoDemo # (required) name of your express component instance.
org: mydjangoDemo # (optional) serverless dashboard org. default is the first org you created during signup.
app: mydjangoDemo # (optional) serverless dashboard app. default is the same as the name property.
stage: release # (optional) serverless dashboard stage. default is dev.
inputs:
region: ap-XXXXXXXXXX
functionName: DjangoFunction
djangoProjectName: mydjangocomponent
src:
src: ./src
functionConf:
timeout: 10
memorySize: 256
environment:
variables:
TEST: vale
vpcConfig:
subnetId: ''
vpcId: ''
apigatewayConf:
protocols:
- https
environment: release
主要参数说明
name: 表示实例名,会用在管理路径中
app: 表示应用名,会用在管理路径中
stage: SF框架的命名空间,可以模拟云函数多环境部署
src: 代码入口所在路径
vpcConfig: 配置云函数所在网络,vpcId即vpc网络ID,subnetId即vpc网络的子网ID
使用经验
简介
本文中CI工具,使用的是蓝鲸智云开源的持续集成平台,代码地址https://github.com/tencent/bk-ci/,是一个十分好用的平台,大家可以根据文档搭起来试用。
文档地址:https://bk.tencent.com/docs/document/6.0/129/5868
基于蓝鲸 ServerlessFramework的CICD
完成基于蓝鲸的CICD需要以下几步:
获取账号的KEY和ID
- 登陆腾讯云控制台打开访问管理,地址:https://console.cloud.tencent.com/cam/overview,如下图
- 从左边栏进入 访问密钥 - API密钥管理,点击新建密钥(如已有密钥,可直接使用)
申请构建机
由于Serverless Framework部署云函数到腾讯云走的公网接口,所以构建机需要申请带公网设备,可以找运维协助。
设备申请好后,可以按照如下步骤将构建机加入蓝鲸
安装nodejs环境
1、SF框架需要nodejs最低V10版本,所以下载最新nodejs linux安装包、解压并移动到/usr/local目录下
代码语言:javascript复制[root@VM_75_248_centos ~]# wget https://nodejs.org/dist/v14.15.1/node-v14.15.1-linux-x64.tar.xz
[root@VM_75_248_centos ~]# tar xf node-v14.15.1-linux-x64.tar.xz
[root@VM_75_248_centos ~]# mv node-v14.15.1-linux-x64 /usr/local/node
2、配置PATH环境变量,并用source命令生效配置
代码语言:javascript复制[root@VM_75_248_centos ~]# echo 'export PATH=$PATH:/usr/local/node/bin' >> ~/.bashrc
[root@VM_75_248_centos ~]# source ~/.bashrc
3、验证node是否安装成功
代码语言:javascript复制[root@VM_75_248_centos ~]# node -v
v14.15.1
部署Serverless Framework
代码语言:javascript复制[root@VM_75_248_centos ~]# npm install -g serverless
[root@VM_75_248_centos ~]# sls -v
Framework Core: 2.11.1
Plugin: 4.1.2
SDK: 2.3.2
Components: 3.3.1
根据命令执行结果,可见已安装成功。
在蓝鲸添加构建机
- 打开蓝鲸的环境管理,选择节点
- 在打开的界面选择第三方构建机,打开如下弹窗。根据申请的测试机信息,选择机型、地点等。
根据弹窗:
- 选择机器的系统,不同操作系统安装命令和安装方法不一样;
- 复制安装 Agent 的命令,在你的构建机的目标工作空间中执行该命令,进行 Agent 的下载和安装
- 安装完 Agent 以后,点击刷新,刷新出节点,点击导入即可。
- 在申请的测试机上面执行上图中的命令
- 执行完之后,点击第二步团创中的刷新,测试机就会出现在已连接的节点,点击倒入即可完成构建机导入。
构建流水线
- 打开搭建的蓝鲸平台中的流水线
- 本流水线主要有以下两个stage
- 需要注意的是stage-2,选 按节点选择,找到添加的自定义构建机
- 下面的原子任务,是bash插件。脚本内容只需要输入sls deploy即可
多环境实现
配置多环境
当前SCF没有多环境的概念,我们可以结合sf框架,模拟多环境。关键参数如图
stage是关键,用stage代表环境
functionName中有一个变量,这里是必须的。如果没这个变量,则不同环境的函数会相互覆盖,导致多环境实际无效
src是指scf入口代码真正的路径
vpcConfig是配置网络的,如果需要不同环境间强隔离,可以考虑不同vpc
environment是配置云函数的调用API,建议和stage一致
搞清楚这些参数后,可以在不同代码分枝,建不同的配置文件,结合蓝盾,即可实现多环境
多环境结果
多环境建设OK后,在Serverless Framework管理界面,可以看到如下结果
在scf控制台可以看到如下结果
与自己业务打通
scf如需访问自己传统业务,只需要修改serverless.yml文件中网络配置部分。
- 开发一个接口,其中会调用自研接口
from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
import requests, json
# Create your views here.
def index(request):
d = requests.post('http://0.0.0.0/test_api/search_api/', data=json.dumps({'id': 398137}))
return JsonResponse(d.json())
- release环境,未配置网络
- 发布release环境后,浏览器访问接口
- 在test环境增加自研vpc网络配置
- 浏览器访问验证,已经可以看到接口返回值了
接下来的使用方向
从云函数目前应用场景来看,主要适合实时文件处理、数据处理等场景,大流量场景用的不多,比较类似Python类的胶水语言:聚合各种接口或连接各种系统。但随着系统流量增大、承担的功能越来越重要,需要在下面几个方面实践和调研。
可用性架构输出
从官网介绍来看,小程序已具备可用区容灾、弹性自动扩容能力;借助API Gateway,可以实施流控及状态码监控。接下来可以借助这些能力做可用性架构测试。
开发流程闭环
当前使用云函数,主要是开发人员负担起了测试、灰度、上线等任务,加上函数代码本身比较简单,所以开发速度非常快。但对于一个完整的应用或子系统,如何协作,构建从开发、测试、灰度、上线的全生命周期的管理,也是接下来需要探索的一个问题。
持续运营能力
目前云函数主要的监控是控制台的调用次数,主要的日志功能就是控制台看日志。服务为维度的管理中积累的优秀监控实践、日志系统实践,目前都还不具备,如果想要有更多的核心场景使用云函数,这些能力要尽快完善。
Serverless未来发展趋势的思考
前端赋能
从高德的使用场景来看(出行界面的相关推荐功能使用的是Serverless),在使用Serverless前,推荐相关聚合接口由后端开发(Back-end For Front-end模式),容易形成厚的BFF层。使用Serverless后,转变为前端开发(Serverless For Front-end模式),借助于函数级别的管理模式,也解决了厚BFF层的问题。
随着Serverless生态完善,可以预料会极大解放前端生产力,前端工程师可以承担一部分后端的工作。
简化后端
Serverless的一个特性是自动扩缩容,即在单函数无法承载算力或并发要求时,自动扩充更多实例。那像传统的生产者、消费者模型可以省略了消息层,生产者直接调用消费者,而不需要考虑消费者不够用的情况;再比如多进程编程,借助Redis等设施,也直接可以省略了多进程编程,直接调用云函数即可。
随着基础设施的完善,可以预料后端的设计模式会有新的突破,传统的设计模式会变的更加简单。
驱动基础架构升级
Serverless一个特性是零运维。零运维我的理解是目标,对于实际的it环境,往往有若干环境,若干环境中有不同的基础设施,如dns,Serverless架构如何在没有运维的情况下,Serverless怎么和各环境无缝对接而开发无感,是一个需要考虑的问题。一个可行的点是Serverless和基础网络联动。
另一个特性是自动扩缩容。作为平台服务来讲,客户越多,那客户的行为具有更大的不可预测性,自动扩容的及时性、冗余资源的预测算法,都需要更多考量。
这些问题都对我们当前的基础架构引入了新的问题和挑战。