產(chǎn)品分享社區(qū)
聲明:網(wǎng)站上的服務(wù)均為第三方提供,請用戶注意甄別服務(wù)質(zhì)量
我們的日常工作場景幾乎離不開“云文檔”。
目前,人們對于文檔的需求再不僅僅是簡單的記錄,而擴展到辦公協(xié)同、信息組織、知識分享等。
在國內(nèi)眾多在線文檔中,wolai 因為功能新、迭代快、流暢的異地協(xié)同體驗、高效的信息組織方式以及“信息塊”信息整合等特點,作為一個獨特的存在進入了人們的視線。人們關(guān)注 wolai 獨特的功能和舒適的用戶的用戶體驗,更關(guān)注實現(xiàn)這些背后的技術(shù)架構(gòu)。在一個晴朗下午,我們邀請了 http://wolai.com 的創(chuàng)始人馬銳拉,跟我們聊聊 wolai 背后的 Serverless 架構(gòu)。
我為什么選擇 Serverless 架構(gòu)?
在做 「 wolai 」這款產(chǎn)品之初,我們就希望把架構(gòu)徹底放到 Serverless 上。因此在技術(shù)選型階段,對國內(nèi)外幾款 Serverless 產(chǎn)品進行了細致的調(diào)研,我們發(fā)現(xiàn)阿里云函數(shù)計算(FC)無論在支持上和整體解決方案上,優(yōu)勢都非常突出,并且跟我們的需求非常匹配,因此,我們決定選擇 Serverless 架構(gòu),全面使用阿里云函數(shù)計算(FC)。
作為一個辦公協(xié)同應(yīng)用,wolai 具備多人同時在線編輯文檔功能。要實現(xiàn)這個功能,一個非常穩(wěn)定的 Web 服務(wù)接口和一個具備伸縮能力、支持高并發(fā)寫入、讀取分離的分布式數(shù)據(jù)庫是非常重要的。因此當(dāng)我們發(fā)現(xiàn) Serverless 產(chǎn)品能夠與分布式數(shù)據(jù)庫進行很好的搭配,就初步確認了 wolai 的主體架構(gòu)。
接下來我們開始在阿里云上驗證使用阿里云函數(shù)計算(FC)的可行性。通過驗證發(fā)現(xiàn)阿里云函數(shù)計算(FC)不光能幫助我們解決上述問題,還可以幫助我們大幅度節(jié)省人力成本和云資源使用成本的投入。
以一家初創(chuàng)公司為例,聊聊函數(shù)計算
接下來我想聊聊,為什么在創(chuàng)立公司之初,我會堅持選擇 Serverless 架構(gòu)。我曾在一家支付公司工作,所以我以一家比較典型的支付公司來舉例說明。
不可避免的流量伸縮問題
假設(shè)你創(chuàng)立了一家支付公司,它的背后差不多需要 200 多個系統(tǒng)支撐,如果這些系統(tǒng)大部分都基于 Java ,這就意味著支付業(yè)務(wù)背后的機器是一臺一臺的集群,每一次發(fā)布研發(fā)都需要對這些集群進行分組,然后逐個上下線,這需要耗費巨大人力成本。
除了集群分組,研發(fā)們還需要關(guān)注緩存、日志系統(tǒng)等中間的各個系統(tǒng)是否有瓶頸。一旦發(fā)生問題,就需要在整個運維系統(tǒng)上花費巨大的精力去解決。隨著公司的發(fā)展,你的這家公司的服務(wù)量級終于上升了,這時候你又會發(fā)現(xiàn)成本也隨之大幅度上升了,比如需要部署新的機器,需要花費很多時間去做計算的伸縮工作(確切的說只是“伸”,根本就沒有辦法去“縮”,對不對?)所以流量伸縮問題會是你遇到的第一個問題,同時也是不可避免的問題。
流量的波峰波谷問題
接下來,你還會遇到流量的波峰波谷問題。由于支付請求在晚上比較少,而在白天或大促、秒殺期間,支付請求的并發(fā)數(shù)可能會特別高。如果大批流量在同一時間涌進來,你就需要迅速撥計算資源過去,這需要做非常多的運維工作。
對一家剛創(chuàng)建不久的公司來說,你很難把大量的精力放在運維服務(wù)器上。而這時候你可以選擇 Serverless ,它能夠幫助你解決上述這些問題。你可以把運維服務(wù)器的工作放心的“丟”給 Serverless,而你真正需要關(guān)注的只有自己的業(yè)務(wù)邏輯。
我可以只關(guān)注代碼和客戶的需要
過去我們做 Web 服務(wù),開發(fā)的工作重點在于在 web 服務(wù)器上做各種優(yōu)化,其實這些工作都是在解決一個問題:當(dāng)量級上去之后,服務(wù)器性能能不能抗?。咳绻荒芤鯓幼鰞?yōu)化?開發(fā)者們做 Nginx 性能調(diào)優(yōu)、負載均衡、反向代理等繁雜的優(yōu)化工作,耗費了大量的時間,而當(dāng)我們使用了函數(shù)計算之后,相當(dāng)于把一大部分調(diào)優(yōu)web 服務(wù)器的工作去掉了,這極大的節(jié)省了人力成本,提高了效率。使用函數(shù)計算之后,整個服務(wù)從開發(fā)到上線過程中,研發(fā)可以把絕大部分精力都放在業(yè)務(wù)代碼上,無需關(guān)心服務(wù)本身是怎么穩(wěn)定運行的。
自 2020 年 6 月 15 號業(yè)務(wù)上線以來,我們從來沒有遇到服務(wù) down 掉或者是需要下線維護的問題,而這些問題是使用函數(shù)計算前的常見問題。以往一旦遇到這樣的問題,我們需要耗費很長時間尋找發(fā)生問題的原因,可能需要升級 Web 服務(wù),加幾臺機器,甚至做反向代理和負載均衡……即使這些工作全部做完,再上線的服務(wù)還是會有維護時段,我們依然很難做到服務(wù)持續(xù)在線上。因此函數(shù)計算對我來說很重要的一個功能點就是持續(xù)服務(wù)的能力,通過使用函數(shù)計算,我的業(yè)務(wù)可以穩(wěn)定地、持續(xù)地增量發(fā)布。
我在上一家任職時,每兩周做一次版本發(fā)布,每次發(fā)布都有非常詳細的發(fā)布列表,發(fā)布涉及的條件、依賴項非常多,需要運維去跑的腳本非常復(fù)雜,可以說只要出現(xiàn)一丁點錯誤,整個發(fā)布可能就會演變成一個小事故,甚至是大事故。當(dāng)我們把整個架構(gòu)放在 Serverless 上,把所有的功能進行拆分之后,發(fā)生事故的概率大大降低。即便發(fā)生問題,我可以通過快速回滾來解決問題。現(xiàn)在我們的研發(fā)習(xí)慣每天至少發(fā)布一個版本,當(dāng)天所有解決的問題都會發(fā)布,相比傳統(tǒng)的軟件公司來說,部署在 Serverless 架構(gòu)上我們的迭代速度會快很多。
快照保存系統(tǒng),解決協(xié)同編輯算法問題
對于 wolai 這樣的協(xié)同辦公產(chǎn)品,協(xié)同編輯是產(chǎn)品的重中之重,這個功能對于算法的要求很高,通過使用函數(shù)計算我們同樣很好的解決了這個問題。
wolai 云端筆記功能有一個信息塊(Block)的概念,就是將用戶所能接觸到的最小信息單位從‘文件’縮小到‘信息塊’”。“信息塊”可容納文字段落、表格、清單,以及嵌入來自外部的圖片、視頻等信息,且可被簡易編輯、移動,經(jīng)實時呈現(xiàn)后組成頁面。所以接下來我會以“塊”來指代信息塊。
紅底之上都是一個個獨立的塊
用戶每次按鍵操作后,我們的前端都會有類似快照的保存機制。如果用戶按鍵非???,那他的多次按鍵操作可能在某一個時間切片中組成一個 transaction ,發(fā)回這個函數(shù)計算。然后我們就會記錄下這些操作。當(dāng)?shù)诙€用戶同時進行按鍵操作時,如果他也針對同一個塊做按鍵操作的話,他也會觸發(fā)同樣的操作。
我們會在函數(shù)里面去計算這些操作用戶對這個塊實際影響先后的順序,最后得出它應(yīng)該變成了一個什么樣子,然后函數(shù)計算還會發(fā)出一個隊列的請求,當(dāng)有任何一個塊,或者說它所屬的頁面發(fā)生過這個變化的事件之后,它會丟到這個 redis 里面,5 分鐘之內(nèi)一旦有一個塊或者一個頁面有過更新之后,我們會再調(diào)一個函數(shù),把整個頁面和整個塊去生成一個一個快照。所以我們把函數(shù)和隊列調(diào)用結(jié)合在一起做成了一個自動化的系統(tǒng)。
用戶一旦在頁面或者塊上有編輯,我們都會在固定時間段生成一個快照。我們現(xiàn)在針對單個塊(相當(dāng)于單段文字或者說一個圖片這樣的一個最小單元)一分鐘保存一張快照。相當(dāng)于在1分鐘之內(nèi),用戶只要有過更新,我們都會把它整體變成一個快照,然后放到 OSS 上面去。如果每一個塊是頻繁更新,那么 OSS 上針對這個塊會有特別多的一分鐘的快照,目前我們 OSS 上差不多都已經(jīng)有 10 億多個文件了。如果是頁面級別的編輯,wolai 5 分鐘去保存快照,頻率會低一點,通過函數(shù)計算和隊列結(jié)合,我們制作了一個快照保存系統(tǒng)。
wolai 的 Serverless 架構(gòu)圖
使用 Serverless 解決的問題
通過研究 wolai 的用戶行為會發(fā)現(xiàn),我們的用戶一般會在每天早上上班時打開 wolai 文檔,然后他/她會在一天之中持續(xù)使用直至下班關(guān)閉。我們的用戶并不會像小程序用戶那樣,需要快速打開應(yīng)用,然后即用即走。相反,他們對于應(yīng)用的初始加載速度沒有特別高的要求,因此我們關(guān)注的重點并不是服務(wù)器端的渲染問題。通過研究用戶習(xí)慣,我們更關(guān)注用戶在打開應(yīng)用后,操作的每一步是否能夠快速響應(yīng)的問題,這里面涉及到兩個點:
1、用戶把數(shù)據(jù)發(fā)到我的服務(wù)器上,服務(wù)器是否能快速、穩(wěn)定的接收數(shù)據(jù)?
2、當(dāng)有大量并發(fā)出現(xiàn)時,會不會讓響應(yīng)速度變慢
函數(shù)解耦,讓小團隊發(fā)揮大能量
通過使用函數(shù)計算,wolai 的前端工程師們就可以把從前到后的一整套開發(fā)流程負責(zé)起來,我們的研發(fā)迭代速度非??臁?/p>
為了實現(xiàn)快速迭代,節(jié)省人力,我們把應(yīng)用的每一個小的功能點拆分的非常散,在函數(shù)計算上部署了非常多的服務(wù),同時每個服務(wù)下又會有多個函數(shù),通過人為拆散的方式實現(xiàn)了函數(shù)解耦。這樣做的優(yōu)勢是當(dāng)我們需要發(fā)布時,如果只針對一個函數(shù)做了某些優(yōu)化或者 bug 修復(fù)的話,那就只需要發(fā)布這個函數(shù),完全不需要做整體發(fā)布。因此我們可以每天快速累積發(fā)布,大部分函數(shù)完全解耦,互不影響。我們盡量把所有的函數(shù)完全獨立開,變成獨立的業(yè)務(wù)邏輯。這樣可以保研發(fā)迭代的速度。
目前我們團隊研發(fā)工程師有 10 個人。其中 8 位都是前端工程師,大大提高了團隊人效。
小型企業(yè)使用函數(shù)計算,成本將節(jié)省 50%
在進行選型的時候,我們曾經(jīng)對使用函數(shù)計算的成本問題進行過粗略的測算。我們測算的結(jié)果是,使用函數(shù)計算能比使用傳統(tǒng)框架節(jié)省一半以上計算費用,人力的投入能夠節(jié)省一半甚至更多。
我們可以算一筆賬,如果選擇傳統(tǒng)架構(gòu),以目前系統(tǒng)的復(fù)雜度,我們的應(yīng)用至少需要兩個運維工程師。而現(xiàn)在前端工程師完全可以對系統(tǒng)進行從頭到尾開發(fā)及維護。按照月均 3 萬塊錢的人力成本計算,算上場地、硬件的費用,對于小型公司來說一年至少可以節(jié)省 70-80 萬的運維成本,同時計算資源成本也會同步增加,也就是說如果使用傳統(tǒng)框架一年要花費 100 萬的話,使用函數(shù)計算至少可以變成 50 萬 。
從 2020 年 6 月上線至今,wolai 使用函數(shù)計算的過程非常順滑,從選型到完成項目上線用了非常短的時間。我非常感謝阿里云做出了這樣一款產(chǎn)品。時至今日,人與云計算的分工越來越明確了,相信在計算這個層面,特別是資源調(diào)度層面有了 Serverless 技術(shù)的加持,越來越多的企業(yè)可以不再關(guān)注資源,而是更加專注于如何為客戶提供更好的服務(wù)。期待未來 wolai 能夠與阿里云函數(shù)計算一道做更好的產(chǎn)品。
歡迎您使用WOLAI( https://www.wolai.com/ )!