天天看点

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

作者:阿里云云栖号

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

<无服务器应用程序的>调试提示></h1>

在应用开发过程中,或者应用开发完成,结果并不出乎意料,我们要做一些调试工作。但是,在无服务器体系结构下,调试通常受到正在开发的应用程序可以按预期在本地正常运行的环境的严重限制,但在 FaaS 平台上会出现一些不可预测的问题。而在一些特殊情况下,没有本地模拟在线环境的方法,很难进行项目开发和调试。

无服务器应用程序的调试一直是热门话题,但云供应商并没有放弃对调试方向的深入探索。以阿里云函数计算为例,提供了在线调试、本地调试等多种调试方案。

< h1类"pgc-h-arrow-right-right"数据轨道""5">在线调试</h1>

1. 调试简单

所谓简单调试,就是在控制台中调试。在阿里云函数计算的情况下,可以通过执行按钮在控制台中完成基本调试,如图所示。

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

该函数只是在线调试页面

如有必要,我们还可以通过设置事件来模拟一些事件,如图所示。

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

通过设置事件来模拟事件

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

2. 断点调试

除了简单的调试,一些云厂商还支持断点调试,比如阿里云功能计算的远程调试、腾讯云功能的远程调试等。以阿里云函数计算远程调试为例,可以通过控制台对函数进行在线调试。创建函数后,用户可以选择远程调试,然后单击"打开调试"按钮,如图所示。

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

函数联机断点调试页 (I)

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

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

函数在线断点调试页 (II)

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

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

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

<h1类"pgc-h-right-arrow"数据跟踪""19">本地调试</h1>

1. 命令行工具

目前,大多数FaaS平台为用户提供了相对完整的命令行工具,包括AWS的SAM CLI,阿里云的Funcraft,以及无服务器框架,Server Devlesss等开源项目,以及对多云供应商的其他支持。通过命令行工具调试代码的方法很简单。对于无服务器开发人员,阿里云函数计算在本地进行调试。

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

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

本地函数计算项目

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

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

命令行工具调试函数计算

2. 编辑器插件

以VScode插件为例,下载阿里云函数计算的VSCode插件并配置账号信息时,可以在本地创建一个新函数,并在点后调试断点,如图所示。

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

VSCode 插件调试函数计算

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

<其他调试方案> h1类"pgc-h-arrow-right-"data-track"""30"</h1>

1. Web 框架的本地调试

在阿里云FaaS平台上开发一个传统的Web框架,使用Python语言作为Bottle框架的示例,该框架添加了以下代码:

在线应用部署时,只需在输入方法中填写 ndex.app 即可顺利部署。

2. 本地模拟事件调试

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

这允许通过构造事件对象来实现模拟事件触发。

< h1 类""pgc-h-right-arrow" 数据跟踪""39" >无服务器应用程序优化</h1>

资源评估仍然很重要

无服务器架构虽然按数量付费,但并不意味着它一定比传统的服务器租赁便宜。如果您没有准确评估项目并且不恰当地设置了某些指标,则无服务器体系结构的成本可能会很高。

一般来说,FaaS平台的费用与三个指标直接相关,即配置的功能规格(如内存规格),程序花费的时间以及产生的流量成本。通常,程序花费的时间可能与内存规范和程序本身处理的业务逻辑有关。流量费用与程序本身与客户端交互的数据包的大小有关。因此,在这三个常见指标中,由于配置不规则,内存规格可能会导致计费偏差相对较大。在阿里云函数计算的情况下,假设一个 Hello World 程序每天执行 10,000 次,不同大小的内存成本(不包括网络费用)如表所示。

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

从表中可以看出,当程序在128MB内存中正常运行时,如果内存规格设置不正确地设置为3072MB,则潜在的每月成本将飙升25倍!因此,在上线无服务器应用程序之前,请评估资源,以便在更合理的配置中进一步降低成本。

合理的代码包规格

代码包大小在各个云供应商的 FaaS 平台中受到限制。撇开云供应商对代码包的限制,只需说出代码包规范可能产生的影响,从函数的冷启动过程可以看出,如图所示。

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

该函数冷启动流程图

在函数冷启动期间,当上传的代码包太大,或者文件太多导致解压缩太慢时,加载过程会变长,进一步导致冷启动时间变长。

想象一下,当有两个压缩包时,一个是100KB的代码包,另一个是200MB的代码包,这两个包都是在千兆位内网带宽下理想化的(即,无论磁盘存储速度如何等),即使最大速度可以是125MB /秒,前者的下载时间将小于0.01秒,后者为1.6秒。除了下载时间,加上文件的解压缩时间,两者之间的冷启动时间可能相隔2秒。一般来说,对于传统的Web界面,如果希望响应时间超过2秒,这实际上对很多企业来说是不可接受的,所以在打包代码的时候尽量减小包的大小。在节点.js项目的情况下,在打包代码包时,我们可以使用Webpack等方法压缩依赖包的大小,进一步降低整体代码包的规格,提高函数的冷启动效率。

合理的重用实例

实例重用存在于各个云供应商的FaaS平台中,以更好地解决冷启动问题并更合理地利用资源。所谓实例重用是指实例完成请求,不释放请求,但进入静默状态。在一定的时间范围内,如果分配了新的请求,则直接调用相应的方法,无需初始化各种类型的资源等,大大减少了函数冷启动的发生。为了验证,我们可以创建两个函数:

单击控制台中的"测试"按钮以测试这两个函数,以查看它们是否在日志中具有"Test",如表中所示。

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

功能多路复用记录

如您所见,实例重用实际上是一种存在的情况。此外,如果 print("Test") 语句是初始化的数据库连接,或者如果函数 1 和 2 加载深度学习模型,则每次发出请求时是否执行函数 1,函数 2 是否可以重用现有对象?

因此,在实际项目中,有一些初始化可以作为函数2完成,例如:

在机器学习方案中,模型在初始化时加载,避免每次触发函数时加载模型。

在初始化时建立链接对象,避免在每次发出请求时都创建链接对象。

其他一些需要在第一次加载时下载和加载的文件在初始化时实现,以提高实例重用效率。

善于利用功能特性

各个云供应商的 FaaS 平台具有一些功能。所谓平台功能所指的这些功能可能不是CNCF WG-Serverless白皮书v1.0中指定或描述的功能,而仅仅是云平台根据其自身的业务发展和愿望从用户的角度进行挖掘和实现的功能,并且可能只是一个云平台或多个云平台的功能。如果利用得当,这些功能通常会导致业务绩效的质量提高。

1.预冻结和预停止

在阿里云功能计算的情况下,随着平台的发展,用户痛点(特别是阻碍传统应用平滑迁移到无服务器架构)如下。

异步后台指标数据延迟或丢失:如果在请求期间未成功发送,则可能会延迟到下一个请求,或者数据点可能会被丢弃。

同步发送指标的延迟增加:如果在每个请求结束时调用类似 Flush 的接口,不仅会增加每个请求的延迟,还会对后端服务造成不必要的压力。

功能优雅下线:当实例关闭时,需要清理连接、关闭进程、报告状态等。当实例在函数计算中脱机时,开发人员无法掌握它,并且 Webhook 通知函数实例脱机。

基于这些痛点,阿里云发布了运行时扩展。此功能在现有的 HTTP 服务编程模型上进行了扩展,将 PreFreeze 和 PreStop Webhook 添加到现有的 HTTP 服务器模型中。扩展开发人员负责实现 HTTP 处理程序,侦听函数实例生命周期事件,如图所示。

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

适用于扩展编程模型和现有编程模型的草图

PreFreeze:在每个函数计算服务决定冻结当前函数实例之前,函数计算服务调用HTTP GET/prefreeze路径,扩展开发人员负责实现逻辑,以确保在实例冻结之前进行必要的操作,例如等待指标成功发送,如图所示。名为 InvokeFunction 的函数的时间不包括 PreFreeze Hook 的执行时间。

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

预冻结时序图

PreStop:在每个函数计算决定停止当前函数实例之前,函数计算服务调用HTTP GET/prestop路径,扩展开发者负责实现逻辑,以确保在实例发布之前进行必要的操作,例如等待数据库链接关闭,以及报告, 更新状态,依此类推,如图所示。

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

预置时间序列

2. 单实例多并发性

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

无服务器工程实践|无服务器应用程序优化和调试提示无服务器应用程序调试提示联机调试其他调试方案无服务器应用程序优化

单实例多重效果草图

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

单实例多并发的好处如下。

减少执行时间并节省资金。例如,偏置的 I/O 函数可以同时处理实例内的请求,从而减少实例数量,从而减少总体执行时间。

状态可以在请求之间共享。多个请求可以在一个实例中共享一个数据库连接池,从而减少与数据库之间的连接数。

降低冷启动的可能性。由于可以在一个实例中处理多个请求,因此创建的新实例数会减少,冷启动的可能性也会降低。

减少专有网络IP的使用。在相同的负载下,单实例多并发减少了实例总数,从而减少了 VPC IP 的占用空间。

单实例多并发场景更为广泛,例如函数有更多时间等待下游服务响应的场景。单实例多并发性还存在不适合您的应用程序的场景,例如当函数具有共享状态且无法并发访问时,当单个请求的执行消耗大量 CPU 和内存资源时,并且不适合单实例多并发时。

作者简介:刘宇(蒋伟)电子信息博士,阿里云无服务器产品经理,阿里云无服务器云传教士,CIO学院特聘讲师。

友情链接: http://click.aliyun.com/m/1000299610/

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

继续阅读