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