《3-1 Apache InLong 的 SPI 擴展實踐.pdf》由會員分享,可在線閱讀,更多相關《3-1 Apache InLong 的 SPI 擴展實踐.pdf(22頁珍藏版)》請在三個皮匠報告上搜索。
1、Apache InLong的 SPI 擴展實踐周康 騰訊數據 級開發程師Apache InLong PMC 成員Email:?healchowapache.org|0101Apache?InLong?Apache?InLong?簡介簡介項簡介適場景0303InLongInLong ManagerManager 的的 SPISPI 改造實踐改造實踐存在的問題什么是 SPISPI?改造實踐錄 CONTENT|0202InLong?ManagerInLong?Manager 簡介簡介Manager 的作0101Apache?InLong?Apache?InLong?簡介簡介項簡介適場景|01 Apa
2、che?InLong?簡介/是什么官網:https:/inlong.apache.orgApache InLong(應龍)是一個一站式的海量數據集成框架,提供自動、安全、可靠和高性能的數據傳輸能力,方便業務構建基于流式的數據分析、建模和應用。表單數據日志Apps 數據數據集成PrestoHiveMapReduceHDFSHBaseS3SparkFlinkAd-hoc 查詢BI人物畫像數據源數據倉庫數據應用ES最初于 2019 年 11 月由騰訊大數據團隊捐獻到 Apache 孵化器,2022 年 6 月正式孵化畢業,成為 Apache 頂級項目(TLP)。|01 Apache?InLong?簡
3、介/適場景|依托騰訊百萬億級別的數據接入和處理能力,整合了數據采集、匯聚、緩存、分揀全流程,具有簡單易用、穩定可靠、靈活擴展等特性。廣泛應用于廣告、支付、社交、游戲、運營商、人工智能等領域。|0202InLong?ManagerInLong?Manager 簡介簡介Manager 的作|02 InLong?Manager 簡介|InLong 支持數據的采集、匯聚、緩存和分揀,只需一些基礎配置,就可把數據從源端導入到實時計算引擎或者寫入離線存儲系統。系統如何將這些流程串聯起來?|通過 InLong Manager 來管理系統和任務的元數據,串聯任務的全流程。元數據主要有:審批信息 集群配置信息
4、數據 schema 配置(源、目標)02 InLong?Manager 簡介|通過 InLong Dashboard 提供的 Web UI(或 Manager Client 提供的命令行工具)創建數據流任務,任務審批通過后,即可串聯起全部流程,主要包括:|1.創建目標端的庫表結構2.創建 MQ 的 Topic 和消費者3.啟動 Flink 任務,開始從 MQ 消費數據,寫入目標端4.下發采集任務,向 MQ 生產數據0303ManagerManager 的的 SPISPI 改造實踐改造實踐什么是 SPI改造過程改造后的收益|03 Manager 的 SPI 改造實踐/存在的問題|InLong 源
5、于騰訊內網業務,在近10年的發展中,主要支持的數據源和數據存儲如下:|數據源端數據目標端03 Manager 的 SPI 改造實踐/存在的問題|以數據存儲端為例,由于用到的存儲類型有限,且考慮到不同的存儲類型的參數差異較大,我們的配置表是這樣設計的:|03 Manager 的 SPI 改造實踐/存在的問題|在 InLong 上云的過程中,數據源端和目標端的類型急劇增多??梢灶A見,隨著云上客戶規模的增加,還會繼續擴展更多類型的數據源和目標端。|數據源端數據目標端在前面已有類型的基礎上,新增的類型03 Manager 的 SPI 改造實踐/存在的問題|擴展的過程中發現的痛點:維護成本高:表多,重復
6、字段多 大量相似代碼(if-else/switch-case 處理相似邏輯)難擴展:要擴展新的存儲類型,不僅要添加一張表,還要修改接口中的代碼,添加 else/case 語句(不符合開閉原則)|03 Manager 的 SPI 改造實踐/什么是 SPI|SPI,全稱 Service Provider Interface,是 Java 提供的一套用來被第三方實現或者擴展的 API,它可以用來啟用框架擴展和替換組件。翻譯后是“服務提供者接口”,顧名思義,這個接口是給“服務提供者”使用的。|常見示例:加載 數據庫驅動 load 接口的實現類SLF4J 加載不同提供商的日志實現類 日志門面接口的實現類
7、Spring 中自動類型轉換 Type Conversion SPI(Converter SPI、Formatter SPI)等03 Manager 的 SPI 改造實踐/什么是 SPI|以 Flink JDBC Connector 中對不同 JDBC 方言的處理為例:1)首先定義一個開放給外部去實現的 JdbcDialectFactory 接口,由不同的 DB Dialect 去實現:|03 Manager 的 SPI 改造實踐/什么是 SPI|2)在classpath的META-INF/services 目錄下創建一個名為此接口全限定名的文件,內容是各個實現類的全限定名:|3)程序中通過j
8、ava.util.ServiceLoder掃描META-INF/services目錄下的配置文件,根據實現類的全限定名來動態裝載具體的實現類:03 Manager 的 SPI 改造實踐/什么是 SPI|只需要調用 3)中JdbcDialectLoader的加載方法,即可根據傳入的參數動態選中符合條件的實現類,比如傳入的 JDBC URL 以 jdbc:mysql:開頭,在JdbcDialectLoader中就會返回 MySqlDialectFactory:|Java SPI 實際上是“基于接口的編程策略模式配置文件”組合實現的動態加載機制。public static JdbcDialect l
9、oad(String url)ClassLoader cl=Thread.currentThread().getContextClassLoader();List foundFactories=discoverFactories(cl);/.final List matchingFactories=foundFactories.stream().filter(f-f.acceptsURL(url).collect(Collectors.toList();/.return matchingFactories.get(0).create();03 Manager 的 SPI 改造實踐/改造過程|1
10、)精簡服務層代碼,刪除繁瑣的 if-else/switch-case。收斂 Service 層的接口,同一領域模型的請求都在同一個 Service 接口中處理,以保存操作為例:|代碼路徑:org.apache.inlong.manager.service.sink.StreamSinkServiceImpl03 Manager 的 SPI 改造實踐/改造過程|根據不同的類型,通過執行器的工廠找到具體的配置執行器,該執行器去執行真正的保存方法:|代碼路徑:org.apache.inlong.manager.service.sink.SinkOperatorFactory03 Manager 的
11、SPI 改造實踐/改造過程|2)重構數據庫實體模型,一張表支持任意類型 Sink 的配置。表中記錄通用字段,對于不同類型 Sink 的特有字段,通過一個擴展字段來存儲(KV,JSON):|03 Manager 的 SPI 改造實踐/改造過程|不同類型 Sink 的特有參數,轉換成 JSON 格式存儲到ext_params字段中,查詢時再將其解析成其特有的 DTO。相關代碼可以參考:org.apache.inlong.manager.service.sink.AbstractSinkOperator 中 saveOpt 方法調用的 setTargetEntity 方法org.apache.inl
12、ong.manager.service.sink.StreamSinkOperator 接口中getFromEntity 方法的各個實現|其他類似操作,感興趣的朋友請檢視:org.apache.inlong.manager.service.group.InlongGroupOperatororg.apache.inlong.manager.service.sink.StreamSinkOperatororg.apache.inlong.manager.service.source.StreamSourceOperatororg.apache.inlong.manager.service.res
13、ource.sink.SinkResourceOperatororg.apache.inlong.manager.service.resource.queue.QueueResourceOperator03 Manager 的 SPI 改造實踐/改造后的收益|在經過上述改造后,至少帶來了如下收益:1)代碼復用性提高,減少了大量重復/相似邏輯的代碼,降低了維護成本2)代碼擴展性極大增強,增加不同類型的配置,只需要依葫蘆畫瓢,去實現其特殊邏輯即可,也無需改動已有接口3)表的 DDL 不用頻繁變動,降低了維護成本,避免修改 DDL/增加新表 引發線上問題4)可以在不侵入修改開源代碼的情況下,擴展騰訊內部的配置類型,加入內網特有的業務邏輯。|