1. 程式人生 > 實用技巧 >Flutter+FaaS一體化任務編排的思考與設計

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

作者:閒魚技術-古風

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

  • 提升研發體驗:開發者通過鏈式呼叫形式進行任務編排,支援任意型別任務,所有任務都可以靈活的組合,可以任意調整任務的執行順序。
  • 提升研發質量:任務編排框架增加異常型別梳理、異常捕獲與異常監控機制。

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