騰訊文檔業務上云,Serverless 架構應用優秀實踐
近兩年,國內文檔類 SaaS 產品層出不窮,協作云文檔作為云時代辦公的一種工具和方式。與傳統的離線辦公軟件不同,協作云文檔更加注重協作的溝通和效率,同時作為工具類產品也同樣關注性能和體驗。就在不久以前,《一個救命文檔的 24 小時》刷屏朋友圈,在河南暴雨災情中,騰訊文檔快速響應災區需要,提升穩定性,確保產品體驗。
騰訊文檔脫胎于 QQ 家族旗下一款團隊協作 IM 軟件 TIM 的在線文檔模塊,最初基于開源軟件搭建的技術架構,隨著業務的高速發展,已無法完全滿足業務的需求,且積累下了比較沉重的技術債務。團隊經過慎重的討論,決定從底層開始,分模塊,逐步重構整個技術體系。在技術迭代的過程中,團隊也在不斷探索和嘗試業內一些先進成熟的技術解決方案。
騰訊文檔整個技術體系內集成了許多微服務為騰訊文檔提供業務支持,比如 圖像識別、SSR、截圖、文檔預覽 等,這些微服務需要從效率和成本需求出發考慮解決方案,以實現可擴展、易維護、降低開發成本的目標。伴隨著公司自研上云的浪潮,在近來的開發中,團隊在多個微服務項目中深入使用 騰訊云 Serverless 架構,滿足了業務的需求,取得了不錯的效果。
01.騰訊文檔 x Serverless 云函數 多場景應用
1. 應對流量高峰低谷
辦公類產品是有明顯的流量潮汐的,比如上午 8 點到 12 點,下午 2 點到 6 點這幾個時段是流量比較大的時候,其他時間段尤其是凌晨沒什么流量。隨著用戶量快速增加,這種潮汐規律尤為明顯,高峰時期海量用戶的實時修改對服務器造成巨大的壓力。
傳統架構下可以通過增加虛擬機,實現應用的可擴展。但由于預估容量不足,導致業務流量高峰期時,大量用戶出現請求超時的情況,這意味著品牌聲譽受損、用戶流失。雖然可以通過創建虛擬機實例的方式進行擴容,但是仍然要做很多額外的配置。應用底層有很多依賴的框架或語言運行時需要安裝,安裝完成之后還需要配置和部署應用,這個周期至少需要 1-2 個小時,這種情況下傳統的部署架構無法做到資源與流量的匹配。
Serverless 解決方案騰訊文檔借助 Serverless 云函數搭建文檔頁面直出服務,將文檔的內容渲染能力實現為函數,部署在云函數環境上,當文檔業務流量激增,由云函數的負載均衡系統自動分配執行環境,處理海量用戶觸發的內容更新請求負載,動態擴縮容能力為微服務提供最合理的資源分配。同時通過設置云函數預置并發,可預先啟動多個函數實例,保持云函數的活性,消除冷啟動,降低在運行環境初始化和業務代碼初始化產生的耗時。
2. SSR 前端渲染
騰訊文檔自推出以來,已達千萬月活,為了支持用戶打開頁面時能快速看到頁面內容,瀏覽器直接解析 HTML 直出的字符串模版顯示頁面,流量激增導致集群負載、前端渲染壓力增加,首屏加載時間慢等問題。SSR 團隊需要實現一套彈性高可用性的直出解析服務來處理文檔和表格的頁面內容,滿足可擴展、易維護、降低開發成本 的目標。文檔的渲染能力幾乎都是前端同學在負責,而前端同學大多服務端知識積累比較淺,對于服務的開發運維經驗比較少,長期的運維成本是新的架構設計重要的評估維度,從而讓前端團隊可以更加聚焦于業務邏輯本身。
Serverless 解決方案SSR(Server-Side Rendering)需要依賴 Node.js 服務渲染頁面,顯然會比僅僅提供靜態文件的 CSR(Client-Side Rendering)應用需要占用更多服務器 CPU 資源,借助 Serverless 方案,前端同學無需關注 SSR 服務器的部署、運維和擴容,通過云函數對底層服務進行封裝,極大地減少部署運維成本,更加聚焦業務開發,提高開發效率。
全新 Serverless Web Funciton 服務開發模式,只需簡單修改監聽端口,即可將目前流行的 Node.js 框架直接部署上云,享受 Serverless 技術帶來的免運維、低成本、按需擴縮容的眾多優勢,歡迎體驗。
3. 外部服務調用 - OCR 圖像識別
騰訊文檔幻燈片支持編輯公式的能力,OCR 圖像識別是騰訊文檔幻燈片結合外部的 OCR 服務能力來完成文檔內的公式圖片轉換為公式,進而方便用戶進行公示編輯。問題點在于:外部提供的 OCR 服務做了限制,不支持前端請求,僅支持服務端請求。傳統的解決方案需要后臺同學接入,進而增加了人員排期、對接等項目管理的復雜度。
Serverless 解決方案騰訊文檔將外部提供的 OCR 用云函數 SCF 做一層轉發,騰訊文檔再對接聯調云函數的接口。解決了外部服務的限制,同時節省了后臺開發資源,前端業務開發同學可以自己快速對接上外部服務,大大提升了開發效率。
4. 插件中心 - 第三方服務接入
騰訊文檔插件 1.0 的方案是基于對文檔前端封裝到前端插件 SDK 的方案,在內部插件業務嚴重耦合文檔實現的前提下,無法將文檔能力以安全、成體系的方式對外提供,持續去開放前端文檔的編輯的能力,會使前端 SDK 和文檔側的實現逐步變得臃腫,最后有可能會在變成巨石應用上長期存在的技術債務。
Serverless 解決方案插件 2.0 方案的核心是基于后臺內容編輯的能力開放,利用文檔的數據響應式的更新機制,云函數便成為 前端 - 云函數 - 后臺內容編輯 中關鍵環節,將開放的實現從前端剝離,通過云函數承載進行開放。同時,不同服務的調用量級不同,云函數帶有天然的服務隔離和動態修復能力,可針對不同服務相互隔離,分別進行升級拓展,避免服務間的影響。
5. 灰度發布 & 環境隔離
在進行應用版本更新及切換時,為了保證線上整體系統業務穩定,及時發現業務代碼的問題,研發團隊會采取灰度發布的方式測試迭代。通過云函數針對特定的版本進行逐步的流量切換,可以實現某個版本的平滑灰度,保證新上線的版本能夠 在可控的范圍能進行發布迭代。
通過云函數版本隔離測試環境和生產環境,線上通過對 $LASTEST 進行版本的固化,可以把測試環境的 API 網關對接到 TEST 版本,將生產環境對接都固化的版本上,保證生產環境的代碼質量安全。
02.Serverless 架構方案優勢 研發效率提升
本地開發測試后,觸發 CI/CD 流程,就可以完成部署流程。同時,云函數提供了日志監控、灰度、發布回滾等能力,可以通過接口或者插件實現完全自動化的流程。云函數基于騰訊云專業的保障集群,自帶負載均衡和彈性伸縮,開發同學基本不需要再關心運維等問題,可以有更多的時間聚焦業務的優化。服務端經驗較少的前端開發工程師也可以較為輕易的開發維護服務。
成本節約
云函數實現 1ms 計費粒度,按實際用量計費,幫忙用戶獲得顯著的成本優勢,在沒有訪問量時實現自動縮容,節約部署成本。
靈活度高
憑借騰訊云函數的多版本能力,可以靈活部署多個在線版本,通過和網關的配合的,輕松做到多版本共存,提供定制化的處理能力。
加速業務迭代
使用 Serverless 方案之后,極大減少了運維和監控的負擔,開發同學可以把更多的精力放在方案的優化和技術迭代中,快速驗證產品特性,推動團隊技術業務的發展。
03.騰訊文檔 x Serverless 架構 更多場景探索
當下瀏覽器環境是有性能瓶頸的,對于較為復雜的異步邏輯可以考慮使用云函數將邏輯服務化,接下來,騰訊文檔計劃對前端瀏覽器邏輯 Fass 化,可以從前端分離到服務端,進而降低瀏覽器性能壓力。
在協作辦公的賽道上,團隊業務還在快速的成長,面對快速變化的技術迭代,低成本、快速開發、快速部署、快速上線的 Serverless 解決方案成為了團隊在微服務技術選型中優先考慮的架構。借助云函數 SCF 的能力,團隊不用再擔心后臺計算資源的問題,可以更加有信心應對更多突如其來的事件。未來,隨著騰訊文檔開放平臺的建設,會有更多的使用云函數 SCF 的微服務跑在騰訊文檔的業務中,為廣大用戶提供更好的服務。