騰訊云:我們究竟如何推出無(wú)服務(wù)器云函數(shù)?
4月26日消息,騰訊云推出國(guó)內(nèi)首款FaaS(Function as a Service,函數(shù)即服務(wù)) 產(chǎn)品——無(wú)服務(wù)器云函數(shù)SCF。那么,云函數(shù)的真正內(nèi)涵是什么、架構(gòu)原理,關(guān)鍵技術(shù)和發(fā)展趨勢(shì)是什么?騰訊云基礎(chǔ)產(chǎn)品團(tuán)隊(duì)下文將對(duì)上述問(wèn)題進(jìn)行解答。
背景:無(wú)服務(wù)器云函數(shù)的用戶(hù)價(jià)值核心信息:第一,用戶(hù)只需要上傳代碼即可以最簡(jiǎn)捷的方式使用騰訊云高效穩(wěn)定的基礎(chǔ)設(shè)施;第二,兼具成本低廉的特點(diǎn),代碼按需運(yùn)行,空閑時(shí)不收費(fèi)。經(jīng)測(cè)試,按調(diào)用次數(shù)和運(yùn)行時(shí)間付費(fèi),在每個(gè)月請(qǐng)求不足百萬(wàn)時(shí),使用無(wú)服務(wù)器云函數(shù)比使用多臺(tái)云主機(jī)搭建集群的成本減少約70%。
無(wú)服務(wù)器云函數(shù)(Serverless Cloud Function)是騰訊云提供的無(wú)服務(wù)器(serverless)執(zhí)行環(huán)境,幫助用戶(hù)在沒(méi)有購(gòu)買(mǎi)和管理服務(wù)器時(shí)仍能運(yùn)行代碼。用戶(hù)只需要使用云平臺(tái)支持的語(yǔ)言編寫(xiě)核心代碼及設(shè)置代碼運(yùn)行的條件,代碼即可在騰訊云基礎(chǔ)設(shè)施上彈性、安全地運(yùn)行,并可完全管理底層計(jì)算資源,包括服務(wù)器CPU、內(nèi)存、網(wǎng)絡(luò)、代碼部署、彈性伸縮、負(fù)載均衡等服務(wù)。使用無(wú)服務(wù)器云函數(shù)將可免除所有運(yùn)維性操作,企業(yè)和開(kāi)發(fā)者可以更加專(zhuān)注于核心業(yè)務(wù)的開(kāi)發(fā),實(shí)現(xiàn)快速上線(xiàn)和迭代,把握業(yè)務(wù)發(fā)展的節(jié)奏。
一、云函數(shù)的價(jià)值及使用場(chǎng)景
隨著云計(jì)算服務(wù)市場(chǎng)的成熟,用戶(hù)對(duì)云計(jì)算接受程度逐漸提高,借助各類(lèi)基礎(chǔ)云組件,將業(yè)務(wù)上線(xiàn)時(shí)間從月級(jí)縮短到天級(jí),但對(duì)比傳統(tǒng)模式,用戶(hù)仍需基于云組件重構(gòu)非功能性需求;云函數(shù)嘗試將業(yè)務(wù)算法和流程提煉出來(lái)交由用戶(hù)實(shí)現(xiàn),打通各種云服務(wù),并實(shí)現(xiàn)通用的負(fù)載均衡、自動(dòng)伸縮、故障容災(zāi)、安全監(jiān)管等通用功能,真正使得用戶(hù)像搭積木一樣打造個(gè)性化服務(wù),將業(yè)務(wù)上線(xiàn)時(shí)間從天級(jí)縮短到分鐘級(jí)。
相比云主機(jī),云函數(shù)更適合于支持微服務(wù)架構(gòu)業(yè)務(wù)場(chǎng)景。以圖片多規(guī)格壓縮服務(wù)為例,該服務(wù)在用戶(hù)上傳圖片至COS時(shí),自動(dòng)將原始圖片壓縮成適配手機(jī)、平板、電腦等多種大小的規(guī)格。如利用云函數(shù)實(shí)現(xiàn)該服務(wù),用戶(hù)只需創(chuàng)建函數(shù),定義函數(shù)觸發(fā)條件為“圖片上傳”,在線(xiàn)編輯或使用IDE完成代碼編寫(xiě)后上傳,服務(wù)即構(gòu)建完成。用戶(hù)上傳圖片時(shí),自動(dòng)調(diào)用定義的函數(shù)完成圖片的多規(guī)格壓縮,云函數(shù)平臺(tái)根據(jù)上傳并發(fā)量自動(dòng)擴(kuò)縮容函數(shù)實(shí)例,并最終按照實(shí)際調(diào)用消耗計(jì)費(fèi)。
從該示例可以看出,云函數(shù)為用戶(hù)帶來(lái)的主要價(jià)值為:
加快用戶(hù)服務(wù)上線(xiàn)時(shí)間,用戶(hù)只需實(shí)現(xiàn)業(yè)務(wù)算法及流程,上線(xiàn)時(shí)間縮短為分鐘級(jí);
減少用戶(hù)的運(yùn)營(yíng)負(fù)擔(dān),用戶(hù)無(wú)須承擔(dān)服務(wù)擴(kuò)容,故障恢復(fù)運(yùn)維工作;
消除用戶(hù)的資源成本,用戶(hù)無(wú)需承擔(dān)資源閑置費(fèi)用,只為實(shí)際調(diào)用消耗付費(fèi);
二、云函數(shù)架構(gòu)原理
云函數(shù)平臺(tái)整體架構(gòu)原理如圖所示。云函數(shù)為用戶(hù)提供SDK/WEBUI兩種使用方式,并通過(guò)事件注冊(cè)與回調(diào)機(jī)制與其它云組件打通,提供標(biāo)準(zhǔn)的API接口;調(diào)用分發(fā)根據(jù)函數(shù)所屬的區(qū)域,用戶(hù),名字,版本號(hào),鑒權(quán)等信息申請(qǐng)函數(shù)實(shí)例,并將調(diào)用均勻的分發(fā)到可用函數(shù)實(shí)例;函數(shù)管理負(fù)責(zé)創(chuàng)建/修改/刪除函數(shù),并提供函數(shù)代碼管理,版本管理等功能;函數(shù)調(diào)度根據(jù)函數(shù)資源需求選擇合適的位置創(chuàng)建/銷(xiāo)毀函數(shù)實(shí)例;函數(shù)實(shí)例部署用戶(hù)定義的函數(shù),負(fù)責(zé)函數(shù)的執(zhí)行及監(jiān)管。
從云函數(shù)的定位及架構(gòu)原理看,衡量云函數(shù)平臺(tái)的關(guān)鍵技術(shù)指標(biāo)可概括為:
不僅支持業(yè)務(wù)快速上線(xiàn),且能實(shí)現(xiàn)持續(xù)發(fā)展;
不僅支持業(yè)務(wù)按需取用,且能釋放閑置資源;
不僅支持業(yè)務(wù)永不中斷,且能擴(kuò)展運(yùn)行范圍;
不僅支持業(yè)務(wù)自由運(yùn)行,且能避免干擾入侵;
下文將展開(kāi)詳述。
三、支持業(yè)務(wù)快速上線(xiàn),且能實(shí)現(xiàn)持續(xù)發(fā)展
支持業(yè)務(wù)分鐘級(jí)上線(xiàn),需要盡可能的減少用戶(hù)研發(fā)工作量,云函數(shù)用戶(hù)僅需提供簡(jiǎn)單的函數(shù)配置及代碼即可完成上線(xiàn)。以圖片壓縮為例,用戶(hù)自行編輯python代碼如下,即可實(shí)現(xiàn)一個(gè)圖片壓縮服務(wù):
其中第1行引入依賴(lài)庫(kù),第4~9行解析輸入?yún)?shù),第11行調(diào)用庫(kù)完成圖片壓縮,12~15行判斷結(jié)果及返回。用戶(hù)可在線(xiàn)完成代碼的編輯并提交,也可像開(kāi)發(fā)本地程序一樣使用喜歡的IDE編輯,調(diào)試通過(guò)后打成zip包通過(guò)SDK提交,提交成功服務(wù)即上線(xiàn)。
支持業(yè)務(wù)可持續(xù)發(fā)展,需提供用戶(hù)函數(shù)平滑升級(jí)及版本變更能力,當(dāng)用戶(hù)更新函數(shù)代碼或配置后,新調(diào)用請(qǐng)求被分發(fā)至新函數(shù)實(shí)例,原調(diào)用請(qǐng)求執(zhí)行完成后,舊函數(shù)實(shí)例自動(dòng)消亡,服務(wù)在客戶(hù)不感知情況下平滑更新。即將支持用戶(hù)函數(shù)多版本管理,將函數(shù)別名映射至用戶(hù)指定版本,在客戶(hù)不感知情況下實(shí)現(xiàn)多版本間平滑切換。
函數(shù)運(yùn)行過(guò)程中間,用戶(hù)打印日志,標(biāo)準(zhǔn)輸出/錯(cuò)誤輸出日志分類(lèi)上傳至騰訊云日志服務(wù)平臺(tái),用戶(hù)可實(shí)時(shí)監(jiān)控函數(shù)運(yùn)行情況。
四、支持業(yè)務(wù)按需取用,且能釋放閑置資源
要支持云函數(shù)真正按需取用,需實(shí)現(xiàn)用戶(hù)第一次調(diào)用時(shí)延遲分配資源,函數(shù)調(diào)用過(guò)程如下圖所示:
云函數(shù)平臺(tái)在調(diào)用分發(fā)時(shí),會(huì)判斷是否有函數(shù)實(shí)例存在,如若不存在,則實(shí)時(shí)啟動(dòng)實(shí)例,實(shí)例啟動(dòng)完成后,才開(kāi)始執(zhí)行函數(shù)調(diào)用。為了達(dá)到第一次調(diào)用足夠快的目標(biāo),在調(diào)用過(guò)程中需分階段逐層優(yōu)化:
分發(fā)調(diào)用階段:需減少調(diào)用分發(fā)層級(jí),比如對(duì)于用戶(hù)主動(dòng)發(fā)起的http同步調(diào)用,正常路徑可免去存入持久化隊(duì)列過(guò)程;
鏡像及代碼下載階段:需盡量預(yù)部署以減少下載時(shí)間,比如對(duì)新提交函數(shù),并行啟動(dòng)預(yù)加載,使得第一次調(diào)用發(fā)起時(shí)無(wú)須再去實(shí)時(shí)下載;
容器啟動(dòng)過(guò)程:需簡(jiǎn)化容器啟動(dòng)腳本,使得啟動(dòng)過(guò)程盡量輕量,對(duì)于對(duì)延時(shí)敏感的業(yè)務(wù),提供實(shí)例預(yù)留機(jī)制,用戶(hù)可選擇預(yù)留少量實(shí)例以減少第一次調(diào)用的額外延時(shí);
執(zhí)行函數(shù)調(diào)用:需盡量減少函數(shù)參數(shù),返回?cái)?shù)據(jù)及日志傳遞導(dǎo)致的內(nèi)存拷貝次數(shù);
返回調(diào)用:需盡量減少返回層級(jí);
通過(guò)逐層優(yōu)化,第一次調(diào)用平臺(tái)耗時(shí)可控制在3s左右,后續(xù)調(diào)用平臺(tái)耗時(shí)控制在10ms左右。
隨著客戶(hù)請(qǐng)求量的增加或減少,函數(shù)實(shí)例隨著自動(dòng)擴(kuò)縮容,一般算法如下:
If 當(dāng)前請(qǐng)求數(shù)/當(dāng)前實(shí)例數(shù) > 擴(kuò)容閾值:擴(kuò)容實(shí)例
else 當(dāng)前請(qǐng)求數(shù)/當(dāng)前實(shí)例數(shù) < 縮容閾值:縮容實(shí)例
當(dāng)縮容至最后一個(gè)函數(shù)實(shí)例時(shí),為避免函數(shù)實(shí)例短時(shí)間內(nèi)重復(fù)啟動(dòng)/停止導(dǎo)致客戶(hù)調(diào)用延時(shí)增加,需保留一段時(shí)間延遲釋放。
五、支持業(yè)務(wù)永不中斷,且能擴(kuò)展運(yùn)行范圍
要支持云函數(shù)永不中斷,需實(shí)現(xiàn)2個(gè)容災(zāi)目標(biāo):
硬件故障時(shí)服務(wù)不中斷
平臺(tái)升級(jí)時(shí)服務(wù)不中斷
為實(shí)現(xiàn)這三個(gè)容災(zāi)目標(biāo),整體架構(gòu)需實(shí)現(xiàn)set化,且在各層均需對(duì)應(yīng)的支持:
接入層:基于騰訊云CLB實(shí)現(xiàn)橫向擴(kuò)展,負(fù)載均衡,7層路由能力;
邏輯層:實(shí)現(xiàn)模塊無(wú)狀態(tài)化,模塊內(nèi)部無(wú)狀態(tài)數(shù)據(jù),可隨意啟停替換;
數(shù)據(jù)層:采用一致性存儲(chǔ)倉(cāng)庫(kù)存儲(chǔ)關(guān)鍵數(shù)據(jù);
節(jié)點(diǎn)層:實(shí)現(xiàn)快速節(jié)點(diǎn)故障檢測(cè)及替換恢復(fù);
比如平臺(tái)內(nèi)部Invoker模塊實(shí)例硬件故障時(shí),如下圖所示,由于invoker模塊無(wú)狀態(tài),,故障時(shí)可由接入層CLB模塊自動(dòng)剔除,剔除后新請(qǐng)求分發(fā)至剩余invoker模塊實(shí)例,已接收的異步事件可由其它invoker重試完成,同步http調(diào)用會(huì)直接返回給用戶(hù)錯(cuò)誤請(qǐng)求,由用戶(hù)重試,在故障invoker實(shí)例恢復(fù)后,自動(dòng)添加至CLB中,繼續(xù)分擔(dān)負(fù)載。
當(dāng)平臺(tái)需要升級(jí)API接口時(shí),采用只增不改策略,提供新版本API接口,保持用戶(hù)原有服務(wù)兼容性,用戶(hù)采用新接口時(shí),CLB通過(guò)7層路由,路由至新版本invoker模塊實(shí)例,舊版本實(shí)例隨著負(fù)載的降低逐步縮容,新版本實(shí)例隨著負(fù)載升高逐步擴(kuò)容,以此實(shí)現(xiàn)了用戶(hù)透明的版本平滑升級(jí)。
要實(shí)現(xiàn)云函數(shù)需與各類(lèi)云組件打通,需要云組件提供事件注冊(cè)及回調(diào)機(jī)制,云組件提供可注冊(cè)事件及對(duì)應(yīng)的回調(diào)接口,云函數(shù)確保云組件通信的用戶(hù)權(quán)限打通傳遞。當(dāng)前云函數(shù)實(shí)現(xiàn)了與騰訊云COS存儲(chǔ)組件的打通,馬上將實(shí)現(xiàn)與騰訊云CMQ、云監(jiān)控等其它云產(chǎn)品的打通,并將運(yùn)行范圍擴(kuò)展至CDN邊緣節(jié)點(diǎn),實(shí)現(xiàn)邊緣計(jì)算。
六、支持業(yè)務(wù)自由運(yùn)行,且能避免干擾入侵
云函數(shù)需支持用戶(hù)本地測(cè)試通過(guò)的代碼無(wú)縫在云函數(shù)平臺(tái),需具備足夠的兼容性,及用戶(hù)函數(shù)運(yùn)行時(shí)環(huán)境,需要具備和用戶(hù)開(kāi)發(fā)測(cè)試環(huán)境類(lèi)似的軟件包,安全等配置;同時(shí)避免函數(shù)間干擾,防止惡意入侵。
為了避免用戶(hù)函數(shù)間干擾,云函數(shù)使用了Docker容器來(lái)封裝函數(shù)實(shí)例,通過(guò)docker的名字隔離、空間隔離、權(quán)限限制等機(jī)制實(shí)現(xiàn)用戶(hù)間隔離,輔以實(shí)時(shí)沖突監(jiān)控調(diào)度等措施及時(shí)處理干擾。
為了避免用戶(hù)執(zhí)行代碼影響整個(gè)云函數(shù)平臺(tái),如下圖所示,實(shí)現(xiàn)了云函數(shù)管理平臺(tái)與用戶(hù)函數(shù)的隔離,用戶(hù)函數(shù)無(wú)法感知管理平臺(tái)的網(wǎng)絡(luò)地址,運(yùn)行日志等信息,從而無(wú)從影響云函數(shù)平臺(tái)的運(yùn)行。
為了避免用戶(hù)惡意代碼對(duì)網(wǎng)絡(luò)的探測(cè)和入侵,如下圖所示,用戶(hù)函數(shù)實(shí)例被限制到了受限的公共VPC網(wǎng)絡(luò),需通過(guò)網(wǎng)關(guān)實(shí)現(xiàn)與外網(wǎng)服務(wù)、其它函數(shù)實(shí)例、云組件的互訪(fǎng),同時(shí),為了支持用戶(hù)函數(shù)實(shí)例與個(gè)人CVM虛擬機(jī)的集成,云函數(shù)平臺(tái)通過(guò)彈性網(wǎng)卡打通了與其私有VPC的網(wǎng)絡(luò)通信。
七、云函數(shù)行業(yè)進(jìn)展趨勢(shì)
近年Serverles、微服務(wù)等理念逐步深入人心,云函數(shù)開(kāi)始被用戶(hù)了解接受。為了滿(mǎn)足用戶(hù)對(duì)于更快速上線(xiàn)、更低成本、更優(yōu)架構(gòu)的求索,騰訊云推出了云函數(shù)產(chǎn)品。用戶(hù)不妨從解決實(shí)際問(wèn)題開(kāi)始試用云函數(shù),比如實(shí)現(xiàn)存儲(chǔ)于COS的圖片、視頻、文件的計(jì)算,將定時(shí)任務(wù)從CVM遷移至云函數(shù),減少資源成本等。隨著云函數(shù)可聯(lián)動(dòng)云組件的拓展,支持語(yǔ)言的豐富,調(diào)試工具,流程引擎等逐步完善,云函數(shù)會(huì)逐步成為整個(gè)云平臺(tái)的粘合劑,將各種云組件融合一起,到時(shí)可支持更為復(fù)雜的狀態(tài)服務(wù)場(chǎng)景,成為用戶(hù)通用體貼厚實(shí)的后盾。
歡迎試用騰訊云-云函數(shù)產(chǎn)品,云函數(shù)解決安全接入、故障容災(zāi)、自動(dòng)伸縮、成本優(yōu)化、版本管理等后臺(tái)通用問(wèn)題,用戶(hù)可更省心專(zhuān)注的投入到業(yè)務(wù)創(chuàng)新。希望通過(guò)云函數(shù)能更深入的開(kāi)放騰訊多年在海量服務(wù)耕耘修煉的能力,共享給廣大用戶(hù)使用,與大家一起成長(zhǎng)。































