Serverless 工程实践 | Serverless 应用优化与调试秘诀
作者 | 刘宇(江昱)
前言:本文将以阿里云函数计算为例,提供了在线调试、本地调试等多种应用优化与调试方案。
Serverless 应用调试秘诀








app = bottle.default_app()并且对run方法进行条件限制 (if __name__ == '__main__'):if __name__ == '__main__':bottle.run(host='localhost', port=8080, debug=True)例如:# index.pyimport 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)
import jsondef 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())
Serverless 应用优化


函数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'

在机器学习场景下,在初始化的时候加载模型,避免每次函数被触发都会加载模型。 在初始化的时候建立链接对象,避免每次请求都创建链接对象。 
其他一些需要首次加载时下载、加载的文件在初始化时实现,提高实例复用效率。 
异步背景指标数据延迟或丢失:如果在请求期间没有发送成功,则可能被延迟至下一次请求,或者数据点被丢弃。 同步发送指标增加延时:如果在每个请求结束后都调用类似 Flush 接口,不仅增加了每个请求的延时,对于后端服务也产生了不必要的压力。 
函数优雅下线:实例关闭时应用有清理连接、关闭进程、上报状态等需求。在函数计算中实例下线时,开发者无法掌握,也缺少 Webhook 通知函数实例下线事件。 

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

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


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

Serverless 工程实践系列
评论
