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








app = bottle.default_app()并且對(duì)run方法進(jìn)行條件限制 (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īng)用優(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'

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

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

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


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

Serverless 工程實(shí)踐系列
評(píng)論
圖片
表情
