函数计算如何帮助语雀构建稳定且安全的业务架构?
客戶介紹
語雀是一個專業(yè)的云端知識庫,用于團隊的文檔協(xié)作。現(xiàn)在已是阿里員工進行文檔編寫和知識沉淀的標(biāo)配,并于 2018 年開始對外提供服務(wù)。
客戶痛點
語雀是一個復(fù)雜的 Web 應(yīng)用,也是一個典型的數(shù)據(jù)密集型應(yīng)用(Data-Intensive Application),背后依賴了大量的數(shù)據(jù)庫等云服務(wù)。語雀服務(wù)端是 Node.js 技術(shù)棧。當(dāng)提到 Node 的時候,可能立刻就會有幾個詞浮現(xiàn)在我們腦海之中:單線程(single-threaded)、非阻塞(non-blocking)、異步(asynchronously programming),這些特性一方面非常的適合于構(gòu)建可擴展的網(wǎng)絡(luò)應(yīng)用,用來實現(xiàn) Web 服務(wù)這類 I/O 密集型的應(yīng)用,另一方面它也是大家一直對 Node 詬病的地方,對 CPU 密集型的場景不夠友好,一旦有任何阻塞進程的方法被執(zhí)行,整個進程就被阻塞。
像語雀這樣用 Node 實現(xiàn)整個服務(wù)端邏輯的應(yīng)用,很難保證不會出現(xiàn)一些場景可能會消耗大量 CPU 甚至是死循環(huán)阻塞進程的,以 markdown 轉(zhuǎn)換舉例,由于用戶的輸入無法窮舉,總有各種可能讓轉(zhuǎn)換代碼進入到一個低效甚至是死循環(huán)的場景之中。在 Node 剛出世的年代,很難給這些問題找到完美的解決辦法,而即便是 Java 等基于線程并發(fā)模型的語言,在遇到這樣的場景也很頭痛,畢竟 CPU 對于 Web 應(yīng)用來說都是非常重要的資源。而隨著基礎(chǔ)設(shè)置越來越完善,當(dāng)函數(shù)計算出現(xiàn)時,Node 最大的短板看起來有了一個比較完美的解決方案。
解決方案
“把函數(shù)計算引入之后,我們可以將那些 CPU 密集型、存在不穩(wěn)定因素的操作統(tǒng)統(tǒng)放到函數(shù)計算服務(wù)中去執(zhí)行,而我們的主服務(wù)再次回歸到了 I/O 密集型應(yīng)用模型,又可以愉快的享受 Node 給我們帶來的高效研發(fā)福利了!”語雀產(chǎn)品技術(shù)負(fù)責(zé)人不四表示。
“以語雀中遇到的一個實際場景來舉例,用戶傳入了一些 HTML 或者 Markdown 格式的文檔內(nèi)容,我們需要將其轉(zhuǎn)換成為語雀自己的文檔格式。在絕大部分情況下,解析用戶輸入的內(nèi)容都很快,然而依然存在某些無法預(yù)料到的場景會觸發(fā)解析器的 bug 而導(dǎo)致死循環(huán)的出現(xiàn),甚至我們不太敢升級 Markdown 解析庫和相關(guān)插件以免引入更多的問題。但是隨著函數(shù)計算的引入,我們將這個消耗 CPU 的轉(zhuǎn)換邏輯放到函數(shù)計算上,語雀的主服務(wù)穩(wěn)定性不會再被影響。”
除了幫助 Web 系統(tǒng)分擔(dān)一些 CPU 密集型操作以外,函數(shù)計算還能做什么呢?
語雀支持使用各種代碼形式來繪圖,包括 Plantuml、公式、Mermaid,還有一些將文檔導(dǎo)出成 PDF、圖片等功能。這些場景有兩個特點:
1、他們依賴于一些復(fù)雜的應(yīng)用軟件,例如 Puppeteer、Graphviz 等;
2、可能需要執(zhí)行用戶輸入的內(nèi)容;
支持這類場景看似簡單,通過 process.exec 子進程調(diào)用一下就搞定了。但是當(dāng)我們想把它做成一個穩(wěn)定的對外服務(wù)時,問題就出現(xiàn)了。這些復(fù)雜的應(yīng)用軟件可能從設(shè)計上并沒有考慮要長期運行,長期運行時的內(nèi)存占用、穩(wěn)定性可能會有一些問題,同時在被大并發(fā)調(diào)用時,對 CPU 的壓力非常大。再加上有些場景需要運行用戶輸入的代碼,攻擊者通過構(gòu)建惡意輸入,可以在服務(wù)器上運行攻擊代碼,非常危險。
在沒有引入函數(shù)計算之前,語雀為了支持這些功能,盡管單獨分配了一個任務(wù)集群,在上面運行這些三方服務(wù),接受主服務(wù)的請求來避免影響主服務(wù)的穩(wěn)定性。但是為了解決上面提到的一系列問題還需要付出很大的成本:
1、需要維持一個不小的任務(wù)集群,盡管可能大部分時間都用不上那么多資源。
2、需要定時對三方應(yīng)用軟件進行重啟,避免長時間運行帶來的內(nèi)存泄露,即便如此有些特殊請求也會造成第三方軟件的不穩(wěn)定。
3、對用戶的輸入進行檢測和過濾,防止黑客惡意攻擊,而黑客的攻擊代碼很難完全防住,安全風(fēng)險依舊很大。
最后語雀將所有的第三方服務(wù)都分別打包在函數(shù)中,將這個任務(wù)集群上的功能都拆分成了一系列的函數(shù)放到了函數(shù)計算上。通過函數(shù)計算的特點一下解決了上面的所有問題:
1、函數(shù)計算的計費模式是按照代碼實際運行的 CPU 時間計費,不需要長期維護一個任務(wù)集群了。
2、函數(shù)計算上的函數(shù)運行時盡管會有一些常駐函數(shù)的優(yōu)化,但是基本不用考慮長期運行帶來的一系列問題,且每次調(diào)用之間都相互獨立,不會互相影響。
3、用戶的輸入代碼是運行在一個沙箱容器中,即便不對用戶輸入做任何過濾,惡意攻擊者也拿不到任何敏感信息,同時也無法進入內(nèi)部網(wǎng)絡(luò)執(zhí)行代碼,更加安全。
除了上面提到的這些功能之外,語雀最近還使用 OSS + 函數(shù)計算替換了之前使用的阿里云視頻點播服務(wù)來進行視頻和音頻的轉(zhuǎn)碼。
由于瀏覽器可以直接支持播放的音視頻格式并不多,大量用戶上傳的視頻想要能夠直接在語雀上進行播放需要對它們進行轉(zhuǎn)碼,業(yè)界一般都是通過 FFmpeg 來對音視頻進行轉(zhuǎn)碼的。轉(zhuǎn)碼服務(wù)也是一個典型的 CPU 密集型場景,如果要自己搭建視頻轉(zhuǎn)碼集群會面臨大量的資源浪費,而使用阿里云視頻點播服務(wù),成本也比較高,而且能夠控制的東西也不夠多。函數(shù)計算直接集成了 FFmpeg 提供音視頻處理能力,并集成到應(yīng)用中心,配合 SLS 完善了監(jiān)控和數(shù)據(jù)分析。語雀將音視頻處理從視頻點播服務(wù)遷移到函數(shù)計算之后,通過優(yōu)化壓縮率、減少不必要的轉(zhuǎn)碼等優(yōu)化,將費用降低至之前的 1/5。
使用效果
語雀產(chǎn)品技術(shù)負(fù)責(zé)人不四表示:從語雀的實踐來看,語雀并沒有像 SFF 一樣將 Web 服務(wù)遷移到函數(shù)計算之上(SFF 模式并不是現(xiàn)在的函數(shù)計算架構(gòu)所擅長的),但是函數(shù)計算在語雀整體的架構(gòu)中對穩(wěn)定性、安全性和成本控制起到了非常重要的作用。總結(jié)下來函數(shù)計算非常適合下面幾種場景:
1、對于時效性要求不算非常高的 CPU 密集型操作,分擔(dān)主服務(wù) CPU 壓力。
2、當(dāng)做沙箱環(huán)境執(zhí)行用戶提交的代碼。
3、運行不穩(wěn)定的三方應(yīng)用軟件服務(wù)。
4、需要很強動態(tài)伸縮能力的服務(wù)。
在引入函數(shù)計算之后,語雀現(xiàn)階段的架構(gòu)變成了以一個 Monolith Application 為核心,并將一些獨立的功能模塊根據(jù)使用場景和對能力的要求分別拆分成了 Microservices 和 Serverless 架構(gòu)。應(yīng)用架構(gòu)與團隊成員組成、業(yè)務(wù)形態(tài)息息相關(guān),但是隨著各種云服務(wù)與基礎(chǔ)設(shè)施的完善,我們可以更自如的選擇更合適的架構(gòu)。
由于 Serverless 的出現(xiàn),我們可以將這些存在安全風(fēng)險的,消耗大量 CPU 計算的任務(wù)都遷移到函數(shù)計算上。它運行在沙箱環(huán)境中,不用擔(dān)心用戶的惡意代碼造成安全風(fēng)險,同時將這些 CPU 密集型的任務(wù)從主服務(wù)中剝離,避免出現(xiàn)并發(fā)時阻塞主服務(wù)。按需付費的方式也可以大大節(jié)約成本,不需要為低頻功能場景部署一個常駐服務(wù)。所以我們會盡量的把這類服務(wù)都遷移到 Serverless 上。
原文鏈接:https://developer.aliyun.com/article/783383?
版權(quán)聲明:本文內(nèi)容由阿里云實名注冊用戶自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請查看《阿里云開發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開發(fā)者社區(qū)知識產(chǎn)權(quán)保護指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫侵權(quán)投訴表單進行舉報,一經(jīng)查實,本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。總結(jié)
以上是生活随笔為你收集整理的函数计算如何帮助语雀构建稳定且安全的业务架构?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里 RocketMQ 如何让双十一峰值
- 下一篇: 函数计算助力高德地图平稳支撑亿级流量高峰