Categories
程式開發

高德深度信息接入的平台化演進


導讀

本文介紹了高德地圖中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方式組織,有多層嵌套對象及數組字段,且不同行業的規格並不一樣,平台最終需要把數據組織成近百套不同規格的數據,這種鬆散的、非扁平二維表的數據處理也是挑戰之一,尤其是存在數組上下文的場景裡。

高德深度信息接入的平台化演進 1

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

高德深度信息接入的平台化演進 2

平台分為幾個模塊:

基礎模塊:負責CP、行業、規格、權限等基礎信息的在線化,實現統一管理。

轉換模塊:負責數據獲取、維度對齊、規格映射等處理。

推送模塊:負責轉換後規格數據推送至下游准入服務。

任務模塊:負責對任務的管理,如任務類型、積壓策略和數據差分等。

  • 轉換引擎設計

轉換模塊由轉換引擎、轉換管理器、設計器和調試器四部分組成。

為了降低系統的設計複雜度,所有業務規則的自定義部分均由轉換模塊支持。轉換模塊作為業務自由度最高的模塊,使用相同的底層支持了上層業務的預轉換、轉換和數據分析三種場景,是系統能支持各種複雜業務場景的核心部分,轉換引擎要支持數據獲取、維度對齊、規格映射清洗等配置化及調試功能最複雜多變的部分。

數據獲取

數據獲取能力不僅要支持常見的HTTP、OSS、ODPS、MTOP、MetaQ及Push服務等多種方式,而且還要支持組合疊加。比如先從OSS下載一個文件,解析文件行,根據解析的數據,再調用HTTP服務等場景。

為了支持近乎無限的業務疊加能力和所見即所得的設計效果,我們調研了阿里經濟體內外的多種解決方案,如Blink、Stream平台等,沒有發現可以直接滿足我們業務需求的組件,主要問題為:

  • 基於技術維度組織,需要大量寫代碼或理解技術語義,無法提供業務視角,對數據PM的理解和使用有極大的障礙。
  • 步驟數據視圖是扁平二維表,無法實現鬆散結構傳遞和處理。如果在步驟間自定義業務約束及協議則過於復雜。
  • 無法支持實時無副作用調試,運行流程和調試流程數據會互相污染。

基於以上分析,我們決定不在上述平台上進行二次開發,而且直接基於當前業務場景定制一套引擎,雖然這些引擎無法直接使用,但是PDI的步驟組織及驅動方式和我們的業務場景比較匹配,從自由度、表達力和直觀性幾個角度考慮,轉換引擎捨棄了DAG這種依賴計算和並行調度都相對容易的技術模型,使用和PDI類似的有向圖模型進行組織。

高德深度信息接入的平台化演進 3

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

高德深度信息接入的平台化演進 4

為了保證引擎的執行效率和安全性,我們保證步驟間數據傳遞不會跨進程,所有數據交互全部在內存內完成,且步驟之間均為異步並行執行,通過背壓感知機制從後向前傳導,平衡各步驟間的處理速度差異。

維度對齊

維度對齊是指把不同數據源、不同維度的數據通過給定的業務規則關聯整合成某一種維度的數據,比如深度信息業務一般需要整合成POI維度的數據。理論上有了引擎提供,能直觀表達並堆疊業務的能力可以實現維度對齊的需求。但是,深度信息還有一個問題要解,即面對數據PM使用實時調試的需求,所以無論複雜還是簡單的轉換都需要能隨時調試,並直觀地展示結果,方便數據PM快速分析和排查。

常規ETL裡都會涉及維度對齊的問題,但是由於常規業務一般都是二維數據表間的關聯整合,所以像PDI之類的方案基本都是通過SQL+臨時表的方案進行處理,在設計時即綁定了輸入輸出,調試和運行並無本質的區別,或者調試時需要修改配置,強制輸出到一個臨時存儲,這意味轉換引擎需要依賴特定的外部環境(如特定的數據庫表),造成調試和運行時的數據會互相污染。

我們的數據天然不是二維結構,無法平鋪到表中,自然也就無法使用這種方案。我們採用的是只依賴本機內存+磁盤的方式進行數據處理,如flatten這種數據打散的需求直接用內存實現,不需要藉助存儲;像merge join等可能全量數據交叉運算的直接採用本地磁盤做輔助,實現了全部功能都不需要外部特殊環境支持,秉承這個思路,我們最終實現了具備如下能力的轉換引擎:

純引擎

  • 不寫數據,不生成執行記錄。
  • 不依賴任務及特殊執行環境。
  • 可以隨時初始化並執行。

數據透出

  • 轉換配置不需要指定輸出,數據輸出步驟動態掛接。
  • 多種場景管理器:任務場景會寫到DB,調試場景通過WebSocket回傳到前端頁面。

有了這樣的引擎,綜合考慮調試場景的要求,轉換在設計時不再需要指定輸出目標,輸出目標會在運行時由場景管理器根據調試場景和正常運行場景動態掛接,避免數據互相污染。平台在Web端支持幾乎所有層次的所見即所得的調試分析功能,覆蓋了預轉換、轉換、清洗、推送等幾乎所有環節。

規格映射清洗

為了支持鬆散Schema映射和透明擴展,轉換的行模型(RowSchema)創新性的設計為雙容器結構。

  • 主數據:承載上游步驟的直接結果數據。
  • 數據托盤:承載轉換參數、步驟變量、映射結果等內容。

高德深度信息接入的平台化演進 5

映射步驟通過映射類型、映射規則和清洗參數支持映射清洗一體化。

  • 正向映射:自上而下進行數據提取,以擴展JSONPath表達式(擴展了主數據、數據托盤、數組循環item等上下文語義)為主,多種映射類型為輔。
  • 反向清洗:自下而上逐層清洗,可任意疊加策略。

轉換模塊通過步驟、映射、字段清洗三個層次對數據進行處理,PM使用時只需要通過Web界面拖拽對應組件並簡單填寫一些業務參數即可完成配置。

為了避免業務黑盒問題,系統設計不同於Stream平台的一個地方是系統組件會向後兼容,步驟插件、映射插件、清洗插件都沒有版本的概念。系統不支持的自定義業務在各個系統模塊均可以寫腳本(Groovy)的方式托底實現,但是不允許上傳二進制包,代碼必須以配置形式直接體現,避免後期的維護問題。

生命週期管理

生命週期是指系統要在適當的時機觸發數據的新增、更新、刪除操作。站在數據接入的角度,刪除是一個較為複雜的過程,業務術語稱之為下線。要說清楚下線問題得先說下深度信息的任務模型。

目前我們支持批處理和流處理兩種模型,如大家直觀理解的,批處理任務每次執行都會遞增一個批次號,比如常見的定時任務類型。流模型指任務一旦打開就會始終保持運行,數據一般是通過MetaQ、Push服務等方式被動接收的,沒有批次概念。

為了滿足業務需求我們支持批次過期、時間過期、條件下線三種策略,且支持多策略疊加使用。而這些策略設計時也有各自要考慮的內容,如批次過期怎樣避免掃描全批次的歷史記錄、歷史和重試場景批次號的共享遞增問題;時間過期如何避免對每條記錄綁定定時器造成的定時器數量爆炸等等。

生命週期管理涉及到比較多的任務模塊設計內容,比如任務調度模型及多機分片機制設計,任務預警熔斷邏輯設計,存儲表的設計等,由於深度信息業務的集成需求,接入平台沒有選用開源或阿里經濟體現有的任務調度框架,而是自己定制開發了一個,篇幅有限這裡不再展開論述。

小結展望

深度信息接入平台見證了高德深度接入飛速發展的幾年,以極低的人力投入支撐了高德在各垂類領域的深耕拓源,為高德向生活服務類高頻應用拓展提供了底層數據支持。未來我們還將在全鏈路Debug、運營精細化場景支持、非標數據處理、自由業務編排平台等方面繼續深化和演進。

本文轉載自公眾號高德技術(ID:amap_tech)。

原文鏈接

https://mp.weixin.qq.com/s?__biz=Mzg4MzIwMDM5Ng==&mid=2247484807&idx=1&sn=98c8bbb88dd05b58a3a9604e866460cd&chksm=cf4a5d64f83dd472a7cbe6f4db01430e63a4ec5cbd1919bf2ae943ce554a53a3bf07ebcf18ad&scene=27#wechat_redirect