Serverless 工程实践 | Serverless 应用优化与调试秘诀

简介: 本文将以阿里云函数计算为例,提供了在线调试、本地调试等多种应用优化与调试方案。

作者|刘宇

前言:本文将以阿里云函数计算为例,提供了在线调试、本地调试等多种应用优化与调试方案。

Serverless 应用调试秘诀

在应用开发过程中,或者应用开发完成,所执行结果不符合预期时,我们要进行一定的调试工作。但是在 Serverless 架构下,调试往往会受到极大的环境限制,出现所开发的应用在本地可以健康、符合预期的运行,但是在 FaaS 平台上发生一些不可预测的问题的情况。而且在一些特殊环境下,本地没有办法模拟线上环境,难以进行项目的开发和调试。

Serverless 应用的调试一直都是备受诟病的,但是各个云厂商并没有因此放弃在调试方向的深入探索。以阿里云函数计算为例,其提供了在线调试、本地调试等多种调试方案。

在线调试

1.简单调试

所谓的简单调试,就是在控制台进行调试。以阿里云函数计算为例,其可以在控制台通过“执行”按钮,进行基本的调试,如图所示。

1.png


函数在线简单调试页面

必要的时候,我们也可以通过设置 Event 来模拟一些事件,如图所示。

2.png


通过设置 Event 模拟事件

在线调试的好处是,可以使用线上的一些环境进行代码的测试。当线上环境拥有 VPC 等资源时,在本地环境是很难进行调试的,例如数据库需要通过 VPC 访问,或者有对象存储触发器的业务逻辑等。

2.断点调试

除了简单的调试之外,部分云厂商也支持断点调试,例如阿里云函数计算的远程调试、腾讯云云函数的远程调试等。以阿里云函数计算远程调试为例,其可以通过控制台进行函数的在线调试。当创建好函数之后,用户可以选择远程调试,并点击“开启调试”按钮,如图所示。

3.png


函数在线断点调试页面(一)

开启调试之后,稍等片刻,系统将会进入远程调试界面,如图所示。

4.png


函数在线断点调试页面(二)

此时可以进行一些断点调试,如图所示。

5.png


函数在线断点调试页面(三)

本地调试

1.命令行工具

就目前来看,大部分 FaaS 平台都会为用户提供相对完备的命令行工具,包括 AWS 的SAM CLI、阿里云的 Funcraft,同时也有一些开源项目例如 Serverless Framework、Serverless Devs 等对多云厂商的支持。通过命令行工具进行代码调试的方法很简单。以 Serverless Devs 为例,本地调试阿里云函数计算。

首先确保本地拥有一个函数计算的项目,如图所示。

6.png


本地函数计算项目

然后在项目下执行调试指令,例如在 Docker 中进行调试,如图所示。

7.png


命令行工具调试函数计算

2.编辑器插件

以 VScode 插件为例,当下载好阿里云函数计算的 VSCode 插件,并且配置好账号信息之后,可以在本地新建函数,并且在打点之后可以进行断点调试,如图所示。

8.png


VSCode 插件调试函数计算

当函数调试完成之后,执行部署等操作。

其他调试方案

1.Web 框架的本地调试

在阿里云 FaaS 平台开发传统 Web 框架,以 Python 语言编写的 Bottle 框架为例,可以增加以下代码:

app = bottle.default_app()
并且对run方法进行条件限制 (if __name__ == '__main__'):
if __name__ == '__main__':bottle.run(host='localhost', port=8080, debug=True)
例如:
# index.py
import bottle@bottle.route('/hello/<name>')
def index(name):return "Hello world"app = bottle.default_app()if __name__ == '__main__':bottle.run(host='localhost', port=8080, debug=True)

当部署应用到线上时,只需要在入口方法处填写 ndex.app,即可实现平滑部署。

2.本地模拟事件调试

针对非 Web 框架,我们可以在本地构建一个方法,例如要调试对象存储触发器:

import json
def handler(event, context):print(event)
def test():event = {"events": [{"eventName": "ObjectCreated:PutObject","eventSource": "acs:oss","eventTime": "2017-04-21T12:46:37.000Z","eventVersion": "1.0","oss": {"bucket": {"arn": "acs:oss:cn-shanghai:123456789:bucketname","name": "testbucket","ownerIdentity": "123456789","virtualBucket": ""},"object": {"deltaSize": 122539,"eTag": "688A7BF4F233DC9C88A80BF985AB7329","key": "image/a.jpg","size": 122539},"ossSchemaVersion": "1.0","ruleId": "9adac8e253828f4f7c0466d941fa3db81161****"},"region": "cn-shanghai","requestParameters": {"sourceIPAddress": "140.205.***.***"},"responseElements": {"requestId": "58F9FF2D3DF792092E12044C"},"userIdentity": {"principalId": "123456789"}}]}handler(json.dumps(event), None)
if __name__ == "__main__":print(test())

这样,通过构造一个 event 对象,即可实现模拟事件触发。

Serverless 应用优化

资源评估依旧重要

Serverless 架构虽然是按量付费的,但是并不代表它就一定比传统的服务器租用费用低。如果对自己的项目评估不准确,对一些指标设置不合理,Serverless 架构所产生的费用可能是巨大的。

一般情况下,FaaS 平台的收费和三个指标有直接关系,即所配置的函数规格(例如内存规格等)、程序所消耗的时间以及产生的流量费用。通常情况下,程序所消耗的时间可能与内存规格、程序本身所处理的业务逻辑有关。流量费用与程序本身和客户端交互的数据包大小有关。所以在这三个常见的指标中,可能因为配置不规范导致计费出现比较大偏差的就是内存规格。以阿里云函数计算为例,假设有一个 Hello World 程序,每天都会被执行 10000 次,不同规格的内存所产生的费用(不包括网络费用)如表所示。

9.png

通过表中可以看到,当程序在 128MB 规格的内存中可以正常执行,如果错误地将内存规格设置成 3072MB,可能每月产生的费用将会暴涨 25 倍!所以在上线 Serverless 应用之前,要对资源进行评估,以便以更合理的配置来进一步降低成本。

合理的代码包规格

各个云厂商的 FaaS 平台中都对代码包大小有着限制。抛掉云厂商对代码包的限制,单纯地说代码包的规格可能会产生的影响,通过函数的冷启动流程可以看到,如图所示。

10.png


函数冷启动流程简图

在函数冷启动过程中,当所上传的代码包过大,或者文件过多导致解压速度过慢,就会使加载代码过程变长,进一步导致冷启动时间变久。

设想一下,当有两个压缩包,一个是只有 100KB 的代码压缩包,另一个是 200MB 的代码压缩包,两者同时在千兆的内网带宽下理想化(即不考虑磁盘的存储速度等)下载,即使最大速度可以达到 125MB/s,那么前者的下载时间只有不到 0.01 秒,后者需要 1.6 秒。除了下载时间之外,加上文件的解压时间,那么两者的冷启动时间可能就相差 2 秒。一般情况下,对于传统的 Web 接口,如果要 2 秒以上的响应时间,实际上对很多业务来说是不能接受的,所以在打包代码时就要尽可能地降低压缩包大小。以 Node.js 项目为例,打包代码包时,我们可以采用 Webpack 等方法来压缩依赖包大小,进一步降低整体代码包的规格,提升函数的冷启动效率。

合理复用实例

为了更好地解决冷启动的问题、更合理地利用资源,各个云厂商的 FaaS 平台中是存在实例复用情况的。所谓的实例复用,就是当一个实例完成一个请求后并不会释放,而是进入静默的状态。在一定时间范围内,如果有新的请求被分配过来,则会直接调用对应的方法,而不需要再初始化各类资源等,这在很大程度上减少了函数冷启动的情况出现。为了验证,我们可以创建两个函数:

函数1:
# -*- coding: utf-8 -*-def handler(event, context):print("Test")return 'hello world'
函数2:
# -*- coding: utf-8 -*-
print("Test")def handler(event, context):return 'hello world'

在控制台点击“测试”按钮,对上述两个函数进行测试,判断其是否在日志中输出了 “Test”,统计结果如表所示。

11.png


函数复用记录

可以看到,其实实例复用的情况是存在的。进一步思考,如果 print("Test") 语句是一个初始化数据库连接,或者是函数 1 和函数 2 加载了一个深度学习模型,是不是函数 1 就是每次请求都会执行,而函数 2 可以复用已有对象?

所以在实际的项目中,有一些初始化操作是可以按照函数 2 实现的,例如:

  • 在机器学习场景下,在初始化的时候加载模型,避免每次函数被触发都会加载模型。
  • 在初始化的时候建立链接对象,避免每次请求都创建链接对象。
  • 其他一些需要首次加载时下载、加载的文件在初始化时实现,提高实例复用效率。

善于利用函数特性

各个云厂商的 FaaS 平台都有一些特性。所谓的平台特性,是指这些功能可能并不是 CNCF WG-Serverless Whitepaper v1.0 中规定的能力或者描述的能力,仅仅是作为云平台根据自身业务发展和诉求从用户角度出发挖掘出来并且实现的功能,可能只是某个云平台或者某几个云平台所拥有的功能。这类功能一般情况下如果利用得当会让业务性能有质的提升。

1.Pre-freeze & Pre-stop

以阿里云函数计算为例,在平台发展过程中,用户痛点(尤其是阻碍传统应用平滑迁移至 Serverless 架构)如下。

  • 异步背景指标数据延迟或丢失:如果在请求期间没有发送成功,则可能被延迟至下一次请求,或者数据点被丢弃。
  • 同步发送指标增加延时:如果在每个请求结束后都调用类似 Flush 接口,不仅增加了每个请求的延时,对于后端服务也产生了不必要的压力。
  • 函数优雅下线:实例关闭时应用有清理连接、关闭进程、上报状态等需求。在函数计算中实例下线时,开发者无法掌握,也缺少 Webhook 通知函数实例下线事件。

根据这些痛点,阿里云发布了运行时扩展 (Runtime Extensions) 功能。该功能在现有的 HTTP 服务编程模型上扩展,在已有的 HTTP 服务器模型中增加了 PreFreeze 和 PreStop Webhook。扩展开发者负责实现 HTTP handler,监听函数实例生命周期事件,如图所示。

12.png


扩展编程模型与现有编程模型处理的工作内容简图

  • PreFreeze:在每次函数计算服务决定冷冻当前函数实例前,函数计算服务会调用 HTTP GET/prefreeze 路径,扩展开发者负责实现相应逻辑以确保完成实例冷冻前的必要操作,例如等待指标发送成功等,如图所示。函数调用 InvokeFunction 的时间不包含 PreFreeze Hook 的执行时间。

13.png


PreFreeze时序图

  • PreStop:在每次函数计算决定停止当前函数实例前,函数计算服务会调用 HTTP GET/prestop 路径,扩展开发者负责实现相应逻辑以确保完成实例释放前的必要操作,如等待数据库链接关闭,以及上报、更新状态等,如图所示。

14.png


PreStope 时序图

2.单实例多并发

众所周知,各云厂商的函数计算通常是请求级别的隔离,即当客户端同时发起 3 个请求到函数计算,理论上会产生 3 个实例进行应对,这个时候可能会涉及冷启动以及请求之间状态关联等问题。因此,部分云厂商提供了单实例多并发的能力(例如阿里云函数计算)。该能力允许用户为函数设置一个实例并发度 (InstanceConcurrency) ,即单个函数实例可以同时处理多个请求,如图所示。

15.png


单实例多并发效果简图

如上图所示,假设同时有 3 个请求需要处理,当实例并发度设置为 1 时,函数计算需要创建 3 个实例来处理这 3 个请求,每个实例分别处理 1 个请求;当实例并发度设置为 10 时(即1个实例可以同时处理 10 个请求),函数计算只需要创建 1 个实例就能处理这 3 个请求。

单实例多并发的优势如下。

  • 减少执行时长,节省费用。例如,偏 I/O 函数可以在一个实例内并发处理请求,减少了实例数,从而减少总的执行时长。
  • 请求之间可以共享状态。多个请求可以在一个实例内共用数据库连接池,从而减少和数据库之间的连接数。
  • 降低冷启动概率。由于多个请求可以在一个实例内处理,创建新实例的次数会减少,冷启动概率降低。
  • 减少占用 VPC IP。在相同负载下,单实例多并发可以降低总的实例数,从而减少 VPC IP 的占用。

单实例多并发的应用场景比较广泛,例如函数中有较多时间在等待下游服务响应的场景就比较适合使用该功能。单实例多并发也有不适合应用的场景,例如函数中有共享状态且不能并发访问时,单个请求的执行要消耗大量 CPU 及内存资源,这时就不适合使用单实例多并发功能。

关于作者:
刘宇(江昱)国防科技大学电子信息专业在读博士,阿里云 Serverless 产品经理,阿里云 Serverless 云布道师,CIO 学院特聘讲师。

原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新一代容器平台ACK Anywhere,来了

简介&#xff1a; 近日&#xff0c;阿里云容器服务全面升级为ACK Anywhere&#xff0c;让企业在任何需要云的地方&#xff0c;都能获得一致的容器基础设施能力。 5G、AR、AIoT 等场景在推动新一代云架构的演进&#xff0c;而容器重塑了云的使用方式。 近日&#xff0c;阿里云…

高密自智,体小量大,希捷Exos Corvault存储系统为数据洞察赋能

2022年2月24日——全球领先的海量数据存储基础设施解决方案提供商希捷科技&#xff08;NASDAQ&#xff1a;STX&#xff09;在线上举办了主题为“高密自智&#xff0c;体小量大”的新一代PB级自修复存储系统——Exos Corvault新品鉴赏会。 此次鉴赏会邀请到了E企研究院首席研究…

Apache Flink 在汽车之家的应用与实践

简介&#xff1a; 汽车之家如何基于 Flink 上线了 AutoStream 平台并持续打磨。 本文整理自汽车之家实时计算平台负责人邸星星在 Flink Forward Asia 2020 分享的议题《Apache Flink 在汽车之家的应用及实践》。主要内容包括&#xff1a; 背景及现状AutoStream 平台基于 Flink …

以色列安全厂商Check Point发布全新logo与重要安全新品,持续深耕中国市场

作者 | 宋慧 出品 | CSDN 云计算 2022年伊始&#xff0c;以色列老牌安全厂商Check Point在自家主办的安全行业大会CPX360上&#xff0c;正式宣布将启用全新企业logo以及企业口号。 Check Point公司中国区总经理陈石磊在对国内媒体分享时指出&#xff1a;“公司1993年成立时&am…

Facebook宕机背后,我们该如何及时发现DNS问题

简介&#xff1a; 国庆期间&#xff0c;Facebook 及其旗下 Instagram 和 WhatsApp 等应用全网宕机&#xff0c;停机时间将近 7 小时 5 分钟&#xff0c;Facebook 市值损失 643 亿美元。针对Facebook的宕机问题&#xff0c;我们该如何未雨绸缪&#xff0c;看看云拨测如何帮助客户…

KubeVela 1.1 发布,开启混合环境应用交付新里程碑

简介&#xff1a; KubeVela 作为一个开箱即用、面向现代微服务架构的应用交付与管理平台&#xff0c;今天正式发布了 1.1 版本&#xff0c;以更加用户友好和完善的功能集&#xff0c;开启了“让混合环境应用交付更加简单高效”的重要里程碑。 在云原生理念迅速普及的今天&…

云原生消息、事件、流超融合平台——RocketMQ 5.0 初探

简介&#xff1a; 今天分享的主题是云原生消息事件流超融合平台 RocketMQ 5.0 初探&#xff0c;内容主要分为三个部分&#xff1a; 首先&#xff0c;带大家回顾业务消息领域首选 RocketMQ 4 发展历史以及 4.x 版本的演进与发展。 其次&#xff0c;会为大家详细介绍 RocketMQ 5.…

mysql查找无根节点sql_SQL 双亲节点查找所有子节点的实现方法

怎么保存树状结构的数据呢&#xff1f;在 SQL 中常用的是双亲节点法。创建表如下CREATE TABLE category ( id LONG, parentId LONG, name String(20) )INSERT INTO category VALUES ( 1, NULL, Root )INSERT INTO category VALUES ( 2, 1, Branch1 )INSERT INTO category VALUE…

一文看懂微服务背后的技术演进与应用实践

简介&#xff1a; 2021年7月2日&#xff0c;阿里云用户组&#xff08;AUG&#xff09;第一次线下活动在济南召开。阿里云云原生资深专家李国强结合自身微服务领域经验&#xff0c;现场跟数十家山东企业分享了云原生的代表技术之一“微服务”的演进和应用实践。本文根据作者的现…

1 分钟记住 docker 镜像和容器常用基本命令

作者 | xiaochuhe来源 | CSDN博客镜像常用基本命令查看自己服务器中docker 镜像列表docker images搜索镜像docker search 镜像名 docker search --filterSTARS9000 mysql 搜索 STARS >9000的 mysql 镜像拉取镜像docker pull 镜像名 docker pull 镜像名:tag运行镜像docker ru…

业界首个机密计算容器运行时—Inclavare Containers正式进入CNCF!

简介&#xff1a; Inclavare Containers 通过云原生计算基金会&#xff08;CNCF&#xff09;TOC 投票正式成为 CNCF 官方沙箱项目。 作者&#xff5c;彦荣 2021 年 9月 15 日&#xff0c;Inclavare Containers 通过云原生计算基金会&#xff08;CNCF&#xff09;TOC 投票正式成…

python 矩阵库_NumPy 矩阵库(Matrix)

NumPy 中包含了一个矩阵库 numpy.matlib&#xff0c;该模块中的函数返回的是一个矩阵&#xff0c;而不是 ndarray 对象。由 m n 个数aij排成的 m 行 n 列的数表称为 m 行 n 列的矩阵&#xff0c;简称 m n 矩阵。记作这 mn 个数称为矩阵 A的元素&#xff0c;简称为元&#xff…

顺丰科技 Hudi on Flink 实时数仓实践

简介&#xff1a; 介绍了顺丰科技数仓的架构&#xff0c;趟过的一些问题、使用 Hudi 来优化整个 job 状态的实践细节&#xff0c;以及未来的一些规划。 本文作者为刘杰&#xff0c;介绍了顺丰科技数仓的架构&#xff0c;趟过的一些问题、使用 Hudi 来优化整个 job 状态的实践细…

Paillier半同态加密:原理、高效实现方法和应用

简介&#xff1a; 《数据安全法》已于9月1日起正式实施&#xff0c;两个月后《个人信息保护法》也将开始施行&#xff0c;意味着数据安全和隐私保护方面的监管将会在年内陆续到位。在合规收紧大背景下&#xff0c;“数据孤岛”现象日渐明显。如何实现安全的数据流通&#xff0c…

django给mysql配主从_django中的mysql主从读写分离:一、配置mysql主从分离

一、配置mysql主从同步的步骤&#xff1a;(1) 在主服务器上&#xff0c;必须开启二进制日志机制和配置一个独立的ID(2) 在每一个从服务器上&#xff0c;配置一个唯一的ID&#xff0c;创建一个用来专门复制主服务器数据的账号(3) 在开始复制进程前&#xff0c;在主服务器上记录二…

从 40% 跌至 4%,“糊”了的 Firefox 还能重回巅峰吗?

作者 | 丁广辉 责编 | 张红月出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;Mozilla Firefox&#xff0c;通常简称为Firefox&#xff0c;中文名叫做火狐&#xff0c;是由Mozilla基金会及其子公司Mozilla公司开发的一款自由、开源的网页浏览器。2004年&#x…

如何发现 Kubernetes 中服务和工作负载的异常

简介&#xff1a; 本次分享为Kubernetes 监控公开课的第二节内容&#xff1a;如何发现 Kubernetes 中服务和工作负载的异常。 分享由三个部分组成&#xff1a; 一、Kubernetes 异常定位存在痛点&#xff1b; 二、针对这些痛点&#xff0c;Kubernetes 监控如何更快、更准、更全的…

内含干货PPT下载|一站式数据管理DMS及最新解决方案发布

简介&#xff1a; 今天主要给大家介绍一站式数据管理平台DMS以及解决方案的发布。议题包含企业数据管理当前的一些痛&#xff0c;DMS一站式数据管理平台以及其核心技术&#xff0c;实时数仓解决方案以及相应的应用实践。 “数聚云端智驭未来”——阿里云数据库创新上云峰会暨第…

java 数组数据类型_java基本数据类型和数组

第一类:逻辑型boolean第二类:文本型char第三类:整数型(byte、short、int、long)char类型占2个字节short从-32768到32767int从-2147483648,到2147483647共10位long从-9223372036854775808到9223372036854775807共19位第四类:浮点型(float、double)在数学中0到1有无数个浮点数&am…

kube-scheduler 磁盘调度源码分析

作者 | leadersnowy来源 | CSDN博客kube-scheduler介绍首先我们知道&#xff0c;kube-scheduler的根本工作任务是根据各种调度算法将Pod调度到最合适的工作节点上一、整个调度流程分为两个阶段&#xff1a;1、预选&#xff08;Predicates&#xff09;&#xff1a;输入是所有节点…