Serverless 工程實踐 | Serverless 應用優(yōu)化與調(diào)試秘訣
作者 | 劉宇(江昱)
前言:本文將以阿里云函數(shù)計算為例,提供了在線調(diào)試、本地調(diào)試等多種應用優(yōu)化與調(diào)試方案。
Serverless 應用調(diào)試秘訣








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 應用優(yōu)化


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

在機器學習場景下,在初始化的時候加載模型,避免每次函數(shù)被觸發(fā)都會加載模型。 在初始化的時候建立鏈接對象,避免每次請求都創(chuàng)建鏈接對象。
其他一些需要首次加載時下載、加載的文件在初始化時實現(xiàn),提高實例復用效率。
異步背景指標數(shù)據(jù)延遲或丟失:如果在請求期間沒有發(fā)送成功,則可能被延遲至下一次請求,或者數(shù)據(jù)點被丟棄。 同步發(fā)送指標增加延時:如果在每個請求結束后都調(diào)用類似 Flush 接口,不僅增加了每個請求的延時,對于后端服務也產(chǎn)生了不必要的壓力。
函數(shù)優(yōu)雅下線:實例關閉時應用有清理連接、關閉進程、上報狀態(tài)等需求。在函數(shù)計算中實例下線時,開發(fā)者無法掌握,也缺少 Webhook 通知函數(shù)實例下線事件。

PreFreeze:在每次函數(shù)計算服務決定冷凍當前函數(shù)實例前,函數(shù)計算服務會調(diào)用 HTTP GET/prefreeze 路徑,擴展開發(fā)者負責實現(xiàn)相應邏輯以確保完成實例冷凍前的必要操作,例如等待指標發(fā)送成功等,如圖所示。函數(shù)調(diào)用 InvokeFunction 的時間不包含 PreFreeze Hook 的執(zhí)行時間。

PreStop:在每次函數(shù)計算決定停止當前函數(shù)實例前,函數(shù)計算服務會調(diào)用 HTTP GET/prestop 路徑,擴展開發(fā)者負責實現(xiàn)相應邏輯以確保完成實例釋放前的必要操作,如等待數(shù)據(jù)庫鏈接關閉,以及上報、更新狀態(tài)等,如圖所示。


減少執(zhí)行時長,節(jié)省費用。例如,偏 I/O 函數(shù)可以在一個實例內(nèi)并發(fā)處理請求,減少了實例數(shù),從而減少總的執(zhí)行時長。 請求之間可以共享狀態(tài)。多個請求可以在一個實例內(nèi)共用數(shù)據(jù)庫連接池,從而減少和數(shù)據(jù)庫之間的連接數(shù)。
降低冷啟動概率。由于多個請求可以在一個實例內(nèi)處理,創(chuàng)建新實例的次數(shù)會減少,冷啟動概率降低。 減少占用 VPC IP。在相同負載下,單實例多并發(fā)可以降低總的實例數(shù),從而減少 VPC IP 的占用。
新書推薦

Serverless 工程實踐系列
評論
圖片
表情
