Flutter+Serverless三端一體研發架構,客戶端不僅僅是編寫雙端的代碼,而是擴展了客戶端的工作邊界,形成完整的業務閉環。在新的研發模式落地與實踐的過程中,一直在思考如何提高FaaS端研發體驗與研發質量,以下是落地過程中遇到的問題。

  • 如何提高FaaS研發體驗?FaaS層通常是直接在主幹中逐塊增加業務代碼,這種寫法領域數據間的依賴並不清晰,後續維護時需要針對領域數據進行更換、順序調整或者由串行改並行時需要增加很多工作。

  • 如何提高FaaS側研發質量?客戶端同學編寫FaaS代碼時,需要針對服務端各種異常增加保護性代碼與降級策略,比較容易出現遺漏從而導致整體質量下降。

任務編排是什麼?

回顧一個完整的業務閉環,包括中臺、領域層、業務層與渲染層。雲端一體場景下FaaS側更多的工作集中在業務層與渲染層,進行數據聚合、裁剪、字段映射和結構調整。

以下單業務爲例,FaaS層通過6次HSF(RPC框架)調用獲取領取數據組裝而成。商品信息、收貨地址與閒魚幣可以並行執行,紅包、運費與驗貨擔保可以並行執行,由於依賴商品信息與收貨地址,兩組任務需要串行執行。

上圖中可以把每一個節點(例如:獲取商品信息)抽象爲任務,通過代碼實現此流程就是任務編排。

任務編排如何提升開發體驗

FaaS層通常是直接在主幹中逐塊增加業務代碼,遇到複雜場景時主幹代碼可能百行甚至千行,以下是通過任務編排框架編寫的下單頁功能代碼

  1. 通過Map類型的數據作爲入參,其中多個任務都可能使用到這些參數。

  2. 使用then與thenAll兩個API進行任務編排,then函數表示傳入的函數串行執行,thenAll傳入的函數需要並行執行。

  3. 調用apply進行任務鏈路的執行。

  4. 通過鏈式調用,整體結構非常清晰,框架的侵入性低。

可以看到以上代碼入參、任務編排與獲取結果,結構非常清晰。從代碼上就能看出任務數量、任務流程、任務的串行與並行。通過簡潔、少侵入性與鏈式調用極大提升開發體驗。

requestItemDO 函數是獲取領域數據常見流程,首先是獲取參數userId與itemId,通過HSF獲取商品信息,拿到結果之後判斷此次請求是否有效,如果有效返回具體Model數據。

任務編排的應用場景

任務類型

任務編排並不侷限於HSF任務,由於框架僅要求傳入的是一個函數,通過函數進行抽象,可以支持任意類型的任務編排,例如:HSF、MetaQ、Tair、DB等。

任務編排形式

下單頁的例子是串行&並行共存的場景,任務編排框架支持任意數量串行、並行、複雜場景任務編排。開發同學只需要開發任務函數,然後根據任務需要串行還是並行,調用具體API接口,不用關心同步與異步的各種操作細節。

異步任務

FaaS側的代碼通常都是IO密集型的任務,例如PRC調用、數據庫讀寫等。Dart基於事件隊列(Event Queue)支持異步,其優點是可以同時等待多個IO事件,並不會阻塞主線程,從而降低總體RT(Response-time 響應時間)。Dart 異步機制耗時如下圖:

任務複用與沉澱暢想

針對FaaaS側把單個數據的獲取與處理抽象爲Task,隨着Task沉澱的越來越多,通過多個任務的組裝會出現業務解決方案層,很多場景下都需要安全校驗,例如:判斷用戶是否禁言、商品是否違規等,這些通用的規則也可以在其他也場景中複用,例如安全校驗規則可以在羣聊功能中複用。三端一體研發架構場景下,從數據的獲取、組裝到前端的UI可以一個開發者完成,整個鏈路可以如右圖進行一體化的組件沉澱,一個組件包含領域數據、轉換爲ViewModel、客戶端視圖組件組成,從而形成雲端一體的組件複用,提升整體開發效率。

任務編排如何提高研發質量

客戶端寫FaaS層代碼,需要學習服務端QPS(Query Per Second每秒查詢次數)、RT(Reaction Time 響應時間)、TPS(Transactions Per Second每秒事務處理量)、限流保護、降級保護與熱點保護等,其中最擔心的還是如何保證部署到Serverless平臺上FaaS層代碼的穩定性,如何才能提高質量不出現問題與故障。 可以通過異常分類、如何捕獲異常與異常處理三個角度來分析質量問題。

異常分類

首先總結下服務端常見異常類型:

  • 代碼異常:空指針異常、數組越界等Exception

  • 系統異常:機器異常、內存溢出、線程池佔滿、DB異常等

  • 接口異常:接口響應超時、下游依賴異常

異常捕獲

無論FaaS層出現哪種異常,不能因爲異常而導致用戶長時間無法正常使用功能,需要考慮異常捕獲,並設計整體的降級、監控與告警方案。通常服務端開發都是通過在可能出現問題的場景添加try catch,這樣代碼寫起來不夠簡潔,開發同學更期望看到像上文中 queryItemDO 函數一樣,只編寫業務功能代碼,至於捕獲、通用監控與告警,由任務編排框架進行統一的兜底處理。

任務編排框架把捕獲的異常信息通過兩種方式傳遞給開發同學,一種是針對單個任務的onError,一種是針對整個鏈路的catchError,通過這兩種方式可以優雅的獲取異常堆棧並進行靈活的異常處理。

通過針對調用鏈路設置整體超時時間,避免因任務的等待超時而導致整個接口出現超時的情況。

異常&監控

Sunfire是服務端監控平臺,擁有一整套海量數據實時分析監控系統,提供系統、應用、業務等各種視角的監控能力,如果觸發配置的規則會發送預警。任務編排框架把捕獲的異常與當前FaaS名稱等信息統一輸出到日誌中,在Sunfire平臺配置通用的規則進行異常監控。

收益與展望

任務編排框架Jade可以解決本篇提出的兩個問題:

  • 提升研發體驗:開發者通過鏈式調用形式進行任務編排,支持任意類型任務,所有任務都可以靈活的組合,可以任意調整任務的執行順序。

  • 提升研發質量:任務編排框架增加異常類型梳理、異常捕獲與異常監控機制。

對任務編排的框架的期望並不僅針對任意類型的任務靈活編排,後續在開發階段通過源碼輸出技術文檔與流程圖,針對單任務與任務鏈路進行測試,通過任務編排框架作爲抓手有效打通需求、開發、測試與運維階段,從而達到提高開發效率提高安全性的目標。

相關文章