Flutter+FaaS一體化任務編排的思考與設計

簡介: 閒魚flutter faas一體化提高研發體驗+研發質量前端

做者:閒魚技術-古風數據庫

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

  • 如何提升FaaS研發體驗?
    FaaS層一般是直接在主幹中逐塊增長業務代碼,這種寫法領域數據間的依賴並不清晰,後續維護時須要針對領域數據進行更換、順序調整或者由串行改並行時須要增長不少工做。
  • 如何提升FaaS側研發質量?
    客戶端同窗編寫FaaS代碼時,須要針對服務端各類異常增長保護性代碼與降級策略,比較容易出現遺漏從而致使總體質量降低。

任務編排是什麼?

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

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

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

任務編排如何提高開發體驗?

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

  1. 經過Map類型的數據做爲入參,其中多個任務均可能使用到這些參數。
  2. 使用then與thenAll兩個API進行任務編排,then函數表示傳入的函數串行執行,thenAll傳入的函數須要並行執行。
  3. 調用apply進行任務鏈路的執行。
  4. 經過鏈式調用,總體結構很是清晰,框架的侵入性低。

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

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能夠解決本篇提出的兩個問題:

  • 提高研發體驗:開發者經過鏈式調用形式進行任務編排,支持任意類型任務,全部任務均可以靈活的組合,能夠任意調整任務的執行順序。
  • 提高研發質量:任務編排框架增長異常類型梳理、異常捕獲與異常監控機制。

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

相關文章
相關標籤/搜索