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

2022-01-10 11:52:51 字數 2992 閱讀 8947

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

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

以下單業務為例,faas層通過6次hsf(rpc框架)呼叫獲取領取資料組裝而成。商品資訊、收貨位址與閒魚幣可以並行執行,紅包、運費與驗貨擔保可以並行執行,由於依賴商品資訊與收貨位址,兩組任務需要序列執行。

上圖中可以把每乙個節點(例如:獲取商品資訊)抽象為任務,通過**實現此流程就是任務編排。

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

通過map型別的資料作為入參,其中多個任務都可能使用到這些引數。

使用then與thenall兩個api進行任務編排,then函式表示傳入的函式序列執行,thenall傳入的函式需要並行執行。

通過鏈式呼叫,整體結構非常清晰,框架的侵入性低。

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

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

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

前向一體化 後向一體化 縱向一體化的含義

前向一體化就是企業通過收購或兼併若干商業企業,或者擁有和控制其分銷系統,實行產銷一體化。前向一體化是指獲得分銷商或零售商的所有權或加強對它們的控制,也就是指企業根據市場的需要和生產技術的可能條件,利用自己的優勢,把成品進行深加工的戰略。在生產過程中,物流從順方向移動,稱為前向一體化,採用這種戰略,是...

狀態列一體化

效果圖方法實現 1新增布局屬性 首先要在布局檔案中加入下面兩個屬性 android cliptopadding true android fitssystemwindows true 解釋一下上面兩個布局屬性的意思 android cliptopadding 定義布局間是否有間距 android f...

運維開發一體化

開發者中心為開者提供了資源管理 持續整合 持續交付 容器服務 映象倉庫等應用基礎服務,同時為應用的微服務架構落地提供完備的支撐,結合devops的理念,通過提供自動化運維 日誌管理 中介軟體服務等功能,幫助開發及運維人員降低產品研發迭代過程中的負擔。1.資源管理 以資源池的方式進行計算節點管理,自由...