簡介: 閒魚flutter faas一體化提高研發體驗+研發質量前端
做者:閒魚技術-古風數據庫
Flutter+Serverless三端一體研發架構,客戶端不只僅是編寫雙端的代碼,而是擴展了客戶端的工做邊界,造成完整的業務閉環。在新的研發模式落地與實踐的過程當中,一直在思考如何提升FaaS端研發體驗與研發質量,如下是落地過程當中遇到的問題。數組
回顧一個完整的業務閉環,包括中臺、領域層、業務層與渲染層。雲端一體場景下FaaS側更多的工做集中在業務層與渲染層,進行數據聚合、裁剪、字段映射和結構調整。安全
如下單業務爲例,FaaS層經過6次HSF(RPC框架)調用獲取領取數據組裝而成。商品信息、收貨地址與閒魚幣能夠並行執行,紅包、運費與驗貨擔保能夠並行執行,因爲依賴商品信息與收貨地址,兩組任務須要串行執行。架構
上圖中能夠把每個節點(例如:獲取商品信息)抽象爲任務,經過代碼實現此流程就是任務編排。app
FaaS層一般是直接在主幹中逐塊增長業務代碼,遇到複雜場景時主幹代碼可能百行甚至千行,如下是經過任務編排框架編寫的下單頁功能代碼。框架
能夠看到以上代碼入參、任務編排與獲取結果,結構很是清晰。從代碼上就能看出任務數量、任務流程、任務的串行與並行。經過簡潔、少侵入性與鏈式調用極大提高開發體驗。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層代碼的穩定性,如何才能提升質量不出現問題與故障。能夠經過異常分類、如何捕獲異常與異常處理三個角度來分析質量問題。
首先總結下服務端常見異常類型:
不管FaaS層出現哪一種異常,不能由於異常而致使用戶長時間沒法正常使用功能,須要考慮異常捕獲,並設計總體的降級、監控與告警方案。一般服務端開發都是經過在可能出現問題的場景添加try catch,這樣代碼寫起來不夠簡潔,開發同窗更指望看到像上文中queryItemDO
函數同樣,只編寫業務功能代碼,至於捕獲、通用監控與告警,由任務編排框架進行統一的兜底處理。
任務編排框架把捕獲的異常信息經過兩種方式傳遞給開發同窗,一種是針對單個任務的onError,一種是針對整個鏈路的catchError,經過這兩種方式能夠優雅的獲取異常堆棧並進行靈活的異常處理。
經過針對調用鏈路設置總體超時時間,避免因任務的等待超時而致使整個接口出現超時的狀況。
Sunfire是服務端監控平臺,擁有一整套海量數據實時分析監控系統,提供系統、應用、業務等各類視角的監控能力,若是觸發配置的規則會發送預警。任務編排框架把捕獲的異常與當前FaaS名稱等信息統一輸出到日誌中,在Sunfire平臺配置通用的規則進行異常監控。
任務編排框架Jade能夠解決本篇提出的兩個問題:
對任務編排的框架的指望並不只針對任意類型的任務靈活編排,後續在開發階段經過源碼輸出技術文檔與流程圖,針對單任務與任務鏈路進行測試,經過任務編排框架做爲抓手有效打通需求、開發、測試與運維階段,從而達到提升開發效率提升安全性的目標。