Serverless 工程实践 | Serverless 应用优化与调试秘诀
Serverless
共 7096字,需浏览 15分钟
·
2021-10-01 16:16
作者 | 刘宇(江昱)
前言:本文将以阿里云函数计算为例,提供了在线调试、本地调试等多种应用优化与调试方案。
Serverless 应用调试秘诀
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)
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())
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 工程实践系列
评论