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