Serverless 應(yīng)用優(yōu)化的四則秘訣
作者 | 劉宇
資源評估依舊重要
雖然 Serverless 架構(gòu)是按量付費(fèi)的,但是并不代表它就一定比傳統(tǒng)的服務(wù)器租用費(fèi)用低,如果我們對自己的項(xiàng)目評估不準(zhǔn)確,對一些指標(biāo)設(shè)置不合理,Serverless 架構(gòu)所產(chǎn)生的費(fèi)用可能是巨大的。
所配置的內(nèi)存規(guī)格;
程序所消耗的時(shí)間;
以及產(chǎn)生的流量費(fèi)用。

阿里云函數(shù)計(jì)算不同內(nèi)存規(guī)格收費(fèi)統(tǒng)計(jì)
合理的代碼包規(guī)格

合理利用實(shí)例的復(fù)用
在各個(gè)云廠商的 FaaS 平臺中,為了更好的解決冷啟動(dòng)的問題,為了更合理的利用資源,是存在“實(shí)例”復(fù)用情況的。所謂的實(shí)例復(fù)用,就是當(dāng)一個(gè)實(shí)例完成一個(gè)請求后并不會釋放,而是進(jìn)入“靜默”的狀態(tài)。在一定時(shí)間范圍內(nèi),如果有新的請求被分配過來,則會直接調(diào)用對應(yīng)的方法,而不需要再初始化各類資源等,這在很大程度上減少了函數(shù)冷啟動(dòng)的情況出現(xiàn)。為了驗(yàn)證,我們可以創(chuàng)建兩個(gè)函數(shù):
函數(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ù)用記錄
機(jī)器學(xué)習(xí)場景下,在初始化的時(shí)候加載模型,避免每次函數(shù)被觸發(fā)都會加載模型帶來的效率問題,提高實(shí)例復(fù)用場景下的響應(yīng)效率; 數(shù)據(jù)庫等鏈接操作,可以在初始化的時(shí)候進(jìn)行鏈接對象的建立,避免每次請求都創(chuàng)建鏈接對象;
其他一些需要首次加載時(shí)下載文件,加載文件的場景,在初始化的時(shí)候進(jìn)行這部分需求的實(shí)現(xiàn),可以在實(shí)例復(fù)用的時(shí)候效率更高;
善于利用函數(shù)特性
各個(gè)云廠商的 FaaS 平臺都有一些“平臺特性”,所謂的平臺特性,是指這些功能可能并不是《CNCF WG-Serverless Whitepaper v 1.0》中規(guī)定的能力,或者描述的能力,僅僅是作為云平臺根據(jù)自身業(yè)務(wù)發(fā)展和訴求,從用戶角度出發(fā)挖掘出來,并且實(shí)現(xiàn)的功能,可能只在某個(gè)云平臺或者某幾個(gè)云平臺所擁有的功能。這類功能一般情況下如果利用得當(dāng)會讓我們的業(yè)務(wù)性能等有質(zhì)的提升。
1、Pre-freeze & Pre-stop
異步背景指標(biāo)數(shù)據(jù)延遲或丟失:如果在請求期間沒有發(fā)送成功,則可能被延遲至下一次請求,或者數(shù)據(jù)點(diǎn)被丟棄。 同步發(fā)送指標(biāo)增加延遲:如果在每個(gè)請求結(jié)束后都調(diào)用類似 Flush 接口,不僅增加了每個(gè)請求的延遲,對于后端服務(wù)也產(chǎn)生了不必要的壓力。
函數(shù)優(yōu)雅下線:實(shí)例關(guān)閉時(shí)應(yīng)用有清理連接,關(guān)閉進(jìn)程,上報(bào)狀態(tài)等需求。在函數(shù)計(jì)算中實(shí)例下線時(shí)機(jī)開發(fā)者無法掌握,也缺少 Webhook 通知函數(shù)實(shí)例下線事件。

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

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

2、單實(shí)例多并發(fā)

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

劉宇(花名:江昱)國防科技大學(xué)電子信息專業(yè)在讀博士,阿里云 Serverless 產(chǎn)品經(jīng)理,阿里云 Serverless 麒麟布道師。
新書推薦

本書通過多個(gè)開源項(xiàng)目、多個(gè)云廠商的多款云產(chǎn)品,以及多種途徑向讀者介紹什么是 Serverless 架構(gòu)、如何上手 Serverless 架構(gòu)、不同領(lǐng)域中 Serverless 架構(gòu)的應(yīng)用以及如何從零開發(fā)一個(gè) Serverless 應(yīng)用等。幫助讀者將 Serverless 架構(gòu)融入到自己所在的領(lǐng)域,把 Serverless 項(xiàng)目真實(shí)落地,獲得 Serverless 架構(gòu)帶來的技術(shù)紅利。

社區(qū)官網(wǎng)

Serverless?Devs
http://www.serverless-devs.com/https://github.com/Serverless-Devs/Serverless-Devshttps://serverlessdevs.resume.net.cn/zh-cn/desktop/index.htmlhttp://serverlessdk.oss.devsapp.net/docs/tutorial-dk/intro/reacthttps://serverlessdevs.resume.net.cn/zhcn/cli/index.htmlhttps://serverlesshub.resume.net.cn/#/hubs/special-view
?戳原文,可報(bào)名 1.13 Serverless 技術(shù)實(shí)踐營南京站!評論
圖片
表情
