主頁 > 軟體設計 > 高德深度資訊接入的平臺化演進

高德深度資訊接入的平臺化演進

2020-09-11 15:11:11 軟體設計

導讀
本文介紹了高德地圖中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

標籤:架構設計

上一篇:b2b2c系統jwt權限原始碼分享part2

下一篇:單例模式,反射破環?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more