導讀
本文介紹了高德地圖中POI深度資訊接入在平臺化程序中的一些思考和實踐,從最開始的單體應用,隨著業務發展面臨挑戰,從業務角度提出解決問題的思路和方案,進而轉化成技術設計并落地實作的程序,
背景
POI是Point of Interest的縮寫,即我們通常理解的地點資訊,對普通用戶而言,POI資料除包含名稱、坐標等基本資訊外,還會展示圖片、評論、營業資訊等內容,這些我們統稱為深度資訊,作為真實世界在線上的直接體現,其豐富度、準確度、新鮮度對用戶的出行決策起到了至關重要的作用,也是高德地圖從生活服務等多方面服務大眾的基礎,
為了豐富深度資訊,我們通過多種途徑對接采集資料,每個資料接入源稱之為一個CP(Content Provider),最初只有少量CP的時候,每個CP建立一個應用,完全獨立的存盤、獨立的代碼,甚至采用的是完全不同的技術堆疊,
然而,隨著接入規模不斷上漲,這種單體應對模式逐漸無力支撐,無法批量生產、更新、運維、監控等問題成為了業務迭代路上的絆腳石,大家花在基礎維護等事務上的精力占比甚至超過了業務迭代,
用一組資料說明下深度業務的發展速度:一個季度作業日130天左右,新接入的任務數量卻多達到120個以上,截止目前接入的任務總數是研發人數的100倍以上,單日處理資料量達十億規模,基于對這個趨勢的預判,深度團隊提前開始了平臺化的探索,
平臺化實踐
平臺化的思路是明確的,但是平臺化的具體設計實施卻有諸多不同的選擇,
大多數資料接入系統的設計目標都相對比較純粹:作為接入系統,只要把資料拿到并輸入到本業務體系內就可以,剩余的如資料決議,業務處理都由下游的其他系統再次加工才可形成真正的業務資料,即接入系統從設計之初就是無狀態的,對資料本身的理解也基本與業務無關,
但是考慮高德深度資訊接入業務的特殊性,我們平臺化時并沒有采用這個方案,而是采用一種更集約化的思路,接入平臺本身對資料就需要有充分的理解,不僅負責資料接入,還要負責資料決議、維度對齊、規格映射及生命周期維護等相關內容,平臺直接內置了深度資訊處理流程的全部管控邏輯,
另外,不同于一般的接入系統,除研發(RD)外,產品(PM)也是系統的第一用戶,平臺需要有能力讓PM在了解有限技術約束的條件下自主完成全流程資料接入、分析和除錯,這就對平臺所見即所得的實時設計除錯能力提出了極高的要求,從平臺設計角度要解決以下一些難點:
- 資料規模不均勻:不同CP的資料量和資料體積相差巨大,有的源資料量有幾億條,最少的CP甚至只有一條資料,具體到每條資料大小也差距懸殊,如部分資料單條達到7.5M,有的則只有一個欄位,僅幾個位元組,
- 業務場景不收斂:深度資料來源多且雜:有三方合作介面、離線檔案、經濟體內OSS、ODPS、MetaQ等,且CP資料結構和關聯匹配規則多種多樣、無法預知,需要平臺在設計上能支持各種場景下的維度對齊,
- 映射清洗邏輯復雜:這里還有一個和常規業務不同的點,高德深度資料采用Schema比較松散的JSON方式組織,有多層嵌套物件及陣列欄位,且不同行業的規格并不一樣,平臺最終需要把資料組織成近百套不同規格的資料,這種松散的、非扁平二維表的資料處理也是挑戰之一,尤其是存在陣列背景關系的場景里,

最終我們設計出如圖所示的平臺架構,平臺集成了基礎、轉換、推送和任務調度四個模塊,配合完成深度資訊接入的全部作業,

平臺分為幾個模塊:
基礎模塊:負責CP、行業、規格、權限等基礎資訊的在線化,實作統一管理,
轉換模塊:負責資料獲取、維度對齊、規格映射等處理,
推送模塊:負責轉換后規格資料推送至下游準入服務,
任務模塊:負責對任務的管理,如任務型別、積壓策略和資料差分等,
- 轉換引擎設計
轉換模塊由轉換引擎、轉換管理器、設計器和除錯器四部分組成,
為了降低系統的設計復雜度,所有業務規則的自定義部分均由轉換模塊支持,轉換模塊作為業務自由度最高的模塊,使用相同的底層支持了上層業務的預轉換、轉換和資料分析三種場景,是系統能支持各種復雜業務場景的核心部分,轉換引擎要支持資料獲取、維度對齊、規格映射清洗等配置化及除錯功能最復雜多變的部分,
資料獲取
資料獲取能力不僅要支持常見的HTTP、OSS、ODPS、MTOP、MetaQ及Push服務等多種方式,而且還要支持組合疊加,比如先從OSS下載一個檔案,決議檔案行,根據決議的資料,再呼叫HTTP服務等場景,
為了支持近乎無限的業務疊加能力和所見即所得的設計效果,我們調研了阿里經濟體內外的多種解決方案,如Blink、Stream平臺等,沒有發現可以直接滿足我們業務需求的組件,主要問題為:
- 基于技術維度組織,需要大量寫代碼或理解技術語意,無法提供業務視角,對資料PM的理解和使用有極大的障礙,
- 步驟資料視圖是扁平二維表,無法實作松散結構傳遞和處理,如果在步驟間自定義業務約束及協議則過于復雜,
- 無法支持實時無副作用除錯,運行流程和除錯流程資料會互相污染,
基于以上分析,我們決定不在上述平臺上進行二次開發,而且直接基于當前業務場景定制一套引擎,雖然這些引擎無法直接使用,但是PDI的步驟組織及驅動方式和我們的業務場景比較匹配,從自由度、表達力和直觀性幾個角度考慮,轉換引擎舍棄了DAG這種依賴計算和并行調度都相對容易的技術模型,使用和PDI類似的有向圖模型進行組織,

為了最大限度的支持PM直接對業務場景進行描述,我們最終采納了PDI的轉換引擎設計思路,直接以原始有向圖方式對步驟進行驅動執行,最大限度保持設計直覺和運行時的邏輯一致,從而不需要實作引擎層面的翻譯器、優化器、執行器等復雜組件,

為了保證引擎的執行效率和安全性,我們保證步驟間資料傳遞不會跨行程,所有資料互動全部在記憶體內完成,且步驟之間均為異步并行執行,通過背壓感知機制從后向前傳導,平衡各步驟間的處理速度差異,
維度對齊
維度對齊是指把不同資料源、不同維度的資料通過給定的業務規則關聯整合成某一種維度的資料,比如深度資訊業務一般需要整合成POI維度的資料,理論上有了引擎提供,能直觀表達并堆疊業務的能力可以實作維度對齊的需求,但是,深度資訊還有一個問題要解,即面對資料PM使用實時除錯的需求,所以無論復雜還是簡單的轉換都需要能隨時除錯,并直觀地展示結果,方便資料PM快速分析和排查,
常規ETL里都會涉及維度對齊的問題,但是由于常規業務一般都是二維資料表間的關聯整合,所以像PDI之類的方案基本都是通過SQL+臨時表的方案進行處理,在設計時即系結了輸入輸出,除錯和運行并無本質的區別,或者除錯時需要修改配置,強制輸出到一個臨時存盤,這意味轉換引擎需要依賴特定的外部環境(如特定的資料庫表),造成除錯和運行時的資料會互相污染,
我們的資料天然不是二維結構,無法平鋪到表中,自然也就無法使用這種方案,我們采用的是只依賴本機記憶體+磁盤的方式進行資料處理,如flatten這種資料打散的需求直接用記憶體實作,不需要借助存盤;像merge join等可能全量資料交叉運算的直接采用本地磁盤做輔助,實作了全部功能都不需要外部特殊環境支持,秉承這個思路,我們最終實作了具備如下能力的轉換引擎:
純引擎
- 不寫資料,不生成執行記錄,
- 不依賴任務及特殊執行環境,
- 可以隨時初始化并執行,
資料透出
- 轉換配置不需要指定輸出,資料輸出步驟動態掛接,
- 多種場景管理器:任務場景會寫到DB,除錯場景通過WebSocket回傳到前端頁面,
有了這樣的引擎,綜合考慮除錯場景的要求,轉換在設計時不再需要指定輸出目標,輸出目標會在運行時由場景管理器根據除錯場景和正常運行場景動態掛接,避免資料互相污染,平臺在Web端支持幾乎所有層次的所見即所得的除錯分析功能,覆寫了預轉換、轉換、清洗、推送等幾乎所有環節,
規格映射清洗
為了支持松散Schema映射和透明擴展,轉換的行模型(RowSchema)創新性的設計為雙容器結構,
- 主資料:承載上游步驟的直接結果資料,
- 資料托盤:承載轉換引數、步驟變數、映射結果等內容,

映射步驟通過映射型別、映射規則和清洗引數支持映射清洗一體化,
- 正向映射:自上而下進行資料提取,以擴展JSONPath運算式(擴展了主資料、資料托盤、陣列回圈item等背景關系語意)為主,多種映射型別為輔,
- 反向清洗:自下而上逐層清洗,可任意疊加策略,
轉換模塊通過步驟、映射、欄位清洗三個層次對資料進行處理,PM使用時只需要通過Web界面拖拽對應組件并簡單填寫一些業務引數即可完成配置,
為了避免業務黑盒問題,系統設計不同于Stream平臺的一個地方是系統組件會向后兼容,步驟插件、映射插件、清洗插件都沒有版本的概念,系統不支持的自定義業務在各個系統模塊均可以寫腳本(Groovy)的方式托底實作,但是不允許上傳二進制包,代碼必須以配置形式直接體現,避免后期的維護問題,
生命周期管理
生命周期是指系統要在適當的時機觸發資料的新增、更新、洗掉操作,站在資料接入的角度,洗掉是一個較為復雜的程序,業務術語稱之為下線,要說清楚下線問題得先說下深度資訊的任務模型,
目前我們支持批處理和流處理兩種模型,如大家直觀理解的,批處理任務每次執行都會遞增一個批次號,比如常見的定時任務型別,流模型指任務一旦打開就會始終保持運行,資料一般是通過MetaQ、Push服務等方式被動接收的,沒有批次概念,
為了滿足業務需求我們支持批次過期、時間過期、條件下線三種策略,且支持多策略疊加使用,而這些策略設計時也有各自要考慮的內容,如批次過期怎樣避免掃描全批次的歷史記錄、歷史和重試場景批次號的共享遞增問題;時間過期如何避免對每條記錄系結定時器造成的定時器數量爆炸等等,
生命周期管理涉及到比較多的任務模塊設計內容,比如任務調度模型及多機分片機制設計,任務預警熔斷邏輯設計,存盤表的設計等,由于深度資訊業務的集成需求,接入平臺沒有選用開源或阿里經濟體現有的任務調度框架,而是自己定制開發了一個,篇幅有限這里不再展開論述,
小結展望
深度資訊接入平臺見證了高德深度接入飛速發展的幾年,以極低的人力投入支撐了高德在各垂類領域的深耕拓源,為高德向生活服務類高頻應用拓展提供了底層資料支持,未來我們還將在全鏈路Debug、運營精細化場景支持、非標資料處理、自由業務編排平臺等方面繼續深化和演進,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/5999.html
標籤:架構設計
下一篇:單例模式,反射破環?
