基於 RocketMQ Connect 構建資料流轉處理平臺

阿里云云原生發表於2023-03-17

作者:周波,阿里雲智慧高階開發工程師, Apache RocketMQ Committer

01 從問題中來的 RocketMQ Connect

在電商系統、金融系統及物流系統,我們經常可以看到 RocketMQ 的身影。原因不難理解,隨著數字化轉型範圍的擴大及程式的加快,業務系統的資料也在每日暴增,此時為了保證系統的穩定執行,就需要把執行壓力分擔出去。RocketMQ 就擔任著這樣的角色,它的非同步訊息處理與高併發讀寫能力,決定了系統底層的重構不會影響上層應用的功能。而 RocketMQ 的另一個優勢——可伸縮能力,使系統在面臨流量的不確定性時,實現對流量的緩衝處理。此外,RocketMQ 的順序設計特性使其成為一個天然的排隊引擎,例如,三個應用同時對一個後臺引擎發起請求,確保不引起“撞車”事故。因此,RocketMQ 被用在非同步解耦、削峰填谷以及事務訊息等場景中。

但是,數字化轉型浪潮也帶來了更多使用者對資料價值的關注——如何讓資料產生更大利用價值?RocketMQ 自身不具備資料分析能力,但是有不少使用者希望從 RocketMQ Topic 中獲取資料並進行線上或離線的資料分析。然而,使用市面上的資料整合或資料同步工具,將 RocketMQ Topic 資料同步到一些分析系統中雖然是一種可行方案,卻會引入新的元件,造成資料同步的鏈路較長,時延相對較高,使用者體驗不佳。

舉個例子,假設業務場景中使用 OceanBase 作為資料儲存,同時希望將這些資料同步到 Elasticsearch 進行全文搜尋,有兩種可行的資料同步方案。

方案一: 從 OceanBase 中獲取資料,寫入 Elasticsearch 元件並進行資料同步,在資料來源較少時此方案沒什麼問題,一旦資料增多,開發和維護都非常複雜,此時就要用到第二種方案。

 title=

方案二: 引入訊息中介軟體對上下游進行解藕,這能解決第一種方案的問題,但是一些較為複雜的問題還沒有完全解決。比如,如何將資料從源資料同步到目標系統並保證高效能,如果保證同步任務的部分節點掛掉,資料同步依然正常進行,節點恢復依然可以斷點續傳,同時隨著資料管道的增多,如何管理資料管道也變得十分困難。

 title=

總的來說,資料整合過程中的挑戰主要有五個。

挑戰一: 資料來源多,市面上可能有上百個資料來源,且各資料來源的系統差異較大,實現任意資料來源之間的資料同步工作量較大,研發週期很長。

挑戰二: 高效能問題,如何高效地從源資料系統同步到目的資料系統,並保障其效能。

挑戰三: 高可用問題,即 Failover 能力,當一個節點掛掉是否這個節點的任務就停止了,任務重新啟動是否還可以斷點續傳。

挑戰四: 彈性擴縮容能力,根據系統流量動態增加或減少節點數量,既能透過擴容滿足高峰期業務,也能在低峰期縮減節點,節省成本。

挑戰五: 資料管道的管理運維,隨著資料管道的增多,運維監控的資料管道也會變得越來越複雜,如何高效管理監控眾多的同步任務。

面對上述挑戰 RocketMQ 如何解決?

第一,標準化資料整合 API (Open Messaging Connect API)。在 RocketMQ 生態中增加 Connect 元件,一方面對資料整合過程抽象,抽象標準的資料格式以及描述資料的 Schema,另一方面對同步任務進行抽象,任務的建立、分片都抽象成一套標準化的流程。

第二,基於標準的 API 實現 Connect Runtime。Runtime 提供了叢集管理、配置管理、位點管理、負載均衡相關的能力,擁有了這些能力,開發者或者使用者就只需要關注資料如何獲取或如何寫入,從而快速構建資料生態,如與OceanBase、MySQL、Elasticsearc 等快速建立連線,搭建資料整合平臺。整個資料整合平臺的構建也非常簡單,透過 Runtime 提供的 RESTFull API 進行簡單呼叫即可。

第三,提供完善的運維工具,方便管理同步任務,同時提供豐富的 Metrics 資訊,方便檢視同步任務的 TPS、流量等資訊。

02 RocketMQ Connect 兩大使用場景

這裡為大家整理了 RocketMQ Connect 的兩大使用場景。

場景一,RocketMQ 作為中間媒介,可以將上下游資料打通,比如在新舊系統遷移的過程中,如果在業務量不大時使用 MySQL 就可以滿足業務需求,而隨著業務的增長,MySQL 效能無法滿足業務要求時,需要對系統進行升級,選用分散式資料庫OceanBase 提升系統效能。

如何將舊系統資料無縫遷移到 OceanBase 中呢?在這個場景中 RocketMQ  Connect 就可以發揮作用,RocketMQ Connect 可以構建一個從 MySQL 到 OceanBase 的資料管道,實現資料的平滑遷移。RocketMQ Connect 還可以用在搭建資料湖、搜尋引擎、ETL 平臺等場景。例如將各個資料來源的資料整合到 RocketMQ Topic當中,目標儲存只需要對接 Elasticsearch 就可以構建一個搜尋平臺,目標儲存如果是資料湖就可以構建一個資料湖平臺。

除此之外,RocketMQ 自身也可以作為一個資料來源,將一個 RocketMQ 叢集的資料同步到另一個叢集,可以構建 RocketMQ 多活容災能力,這是社群正在孵化的Replicator可以實現的能力。

 title=

場景二,RocketMQ 作為端點。 RocketMQ 的生態中提供了流計算能力元件 -RocketMQ Streams,Connector 將各個儲存系統的資料整合到 RocketMQ Topic 當中,下游使用 RocketMQ Streams 流計算的能力就可以構建一個實時的流計算平臺。當然也可以配合業務系統的 Service 實現業務系統快速從其它儲存統一快速獲取資料的能力。

 title=

還可以將 RocketMQ 作為端點的上游,將業務訊息發到 Topic 中,使用 Connector 對資料做持久化或轉存的操作。

 title=

如此一來,RocketMQ 就具備資料整合能力,可以實現任意任意異構資料來源之間的資料同步,同時也具備統一的叢集管理、監控能力及配置化搭建資料管道搭建能力,開發者或者使用者只需要專注於資料複製,簡單配置就可以得到一個具備配置化、低程式碼、低延時、高可用,支援故障處理和動態擴縮容資料整合平臺。

那麼, RocketMQ Connect 是如何實現的呢?

03 RocketMQ Connect 實現原理

在介紹實現原理前,先來了解兩個概念。

概念一,什麼是 Connector(聯結器)? 它定義資料從哪複製到哪,是從源資料系統讀取資料寫入RocketMQ,這種是 SourceConnector,或從 RocketMQ 讀資料寫入到目標系統,這種是 SinkConnector。Connector 決定需要建立任務的數量,從 Worker 接收配置傳遞給任務。

 title=

概念二,什麼是 Task ? Task 是 Connector 任務分片的最小分配單位,是實際將源資料來源資料複製到 RocketMQ(SourceTask),或者將資料從 RocketMQ 讀出寫入到目標系統(SinkTask)真正的執行者,Task 是無狀態的,可以動態的啟停任務,多個 Task 可以並行執行,Connector 複製資料的並行度主要體現在 Task 上。一個 Task 任務可以理解為一個執行緒,多個 Task 則以多執行緒的方式執行。

 title=

透過 Connect 的 API 也可以看到 Connector 和 Task 各自的職責,Connector 實現時就已經確定資料複製的流向,Connector 接收資料來源相關的配置,taskClass 獲取需要建立的任務型別,透過 taskConfigs 的數量確定任務數量,並且為 Task 分配好配置。Task 拿到配置以後資料來源建立連線並獲取資料寫入到目標儲存。透過下面的兩張圖可以清楚的看到,Connector 和 Task 處理基本流程。

 title=

一個 RocketMQ Connect 叢集中會有多個 Connector ,每個 Connector 會對應一個或多個 Task,這些任務執行在 Worker(程式)中。Worker 程式是 Connector 和 Task 執行環境,它提供 RESTFull 能力,接收 HTTP 請求,將獲取到的配置傳遞給 Connector 和Task,它還負責啟動 Connector 和 Task,儲存 Connector 配置資訊,儲存 Task 同步資料的位點資訊,除此以外,Worker 還提供負載均衡能力,Connect 叢集高可用、擴縮容、故障處理主要依賴 Worker 的負責均衡能力實現的。Worker 提供服務的流程如下:

 title=

Worker 提供的服務發現及負載均衡的實現原理如下:

服務發現:

 title=

用過 RocketMQ 的開發者應該知道,它的使用很簡單,就是傳送和接收訊息。消費模式分為叢集模式和廣播模式兩種,叢集消費模式下一個 Topic 可以有多個 Consumer 消費訊息,任意一個 Consumer 的上線或下線 RocketMQ 服務端都有感知,並且還可以將客戶端上下線資訊通知給其它節點,利用 RocketMQ 這個特性就實現了 Worker 的服務發現。

配置/Offset同步:

 title=

Connector 的配置 /Offset 資訊同步透過每個 Worker 訂閱相同的 Topic,不同 Worker 使用不同的 Consumer Group 實現的, Worker 節點可以透過這種方式消費到相同Topic的所有資料,即 Connector 配置 /Offset 資訊,這類似於廣播消費模式,這種資料同步模式可以保證任何一個 Worker 掛掉,該Worker上的任務依舊可以在存活的 Worker 正常拉起執行 ,並且可以獲取到任務對應的 Offset 資訊實現斷點續傳, 這是故障轉移以及高可用能力的基礎。

負載均衡:

RocketMQ 消費場景中,消費客戶端 與Topic Queue 之間有負載均衡能力,Connector 在這一部分也是類似的,只不過它負載均衡的物件不一樣,Connector 是 Worker 節點和 Task 之間的負載均衡,與 RocketMQ 客戶端負載均衡一樣,可以根據使用場景選擇不同負載均衡演算法。

 title=

上文提到過 RocketMQ Connect 提供 RESTFull API能力。透過 RESTFull AP 可以建立 Connector,管理 Connector 以及檢視 Connector 狀態,簡單列舉:

  • POST /connectors/{connector name}
  • GET /connectors/{connector name}/config
  • GET /connectors/{connector name}/status
  • POST /connectors/{connector name}/stop

目前 Connector 支援單機、叢集兩種部署模式。叢集模式至少要有兩個節點,才能保證它的高可用。並且叢集可以動態增加或者減少,做到了動態控制提升叢集效能和節省成本節省的能力。單機模式更多方便了開發者開發測試 Connector 。

如何如何實現一個 Connector 呢? 還是結合一個具體的場景看一看,例如業務資料當前是寫入 MySQL 資料庫中的,希望將 MySQL 中資料實時同步到資料湖 Hudi 當中。只要實現 MySQL Source Connector 、Hudi Sink Connector 這兩個 Connector 即可。

 title=

下面就以 MySQLSource Connector 為例,來看一下具體的如何實現。

實現 Connector 最主要的就是實現兩個 API 。第一個是 Connector API ,除了實現它生命週期相關的 API 外,還有任務如何分配,是透過 Topic、Table 還是透過資料庫的維度去分。第二個API 是需要建立的 Task,Connector 透過任務分配將相關的配置資訊傳遞給 Task, Task 拿到這些資訊,例如資料庫賬號,密碼,IP,埠後就會建立資料庫連線,再透過 MySQL 提供的 BINLOG 機智獲取到表的資料,將這些資料寫到一個阻塞佇列中。Task 有個 Poll 方法,實現 Connector 時只要呼叫到 Poll 方法時可以獲取到資料即可,這樣 Connector 就基本寫完了。然後打包以 Jar 包的形式提供出來,將它載入到 Worker 的節點中。

 title=

建立 Connector 任務後, Worker 中會建立一個或者多個執行緒,不停的輪詢 Poll 方法,從而獲取到 MySQL 表中的資料,再透過 RocketMQ Producer 傳送到 RocketMQ Broker中,這就是 Connector 從實現到執行的整體過程(見下圖)。

04 title=

04 RocketMQ Connect 現狀與未來

RocketMQ Connect 的發展歷程分為三個階段。

第一階段:Preview 階段

RocketMQ Connect 發展的初期也即 Preview 階段,實現了 Open Messaging Connect API 1.0 版本,基於該版本實現了 RocketMQ Connect Runtime ,同時提供了 10+ Connector 實現(MySQL,Redis,Kafka,Jms,MongoDB……)。在該階段,RocketMQ Connect 可以簡單實現端到端的資料來源同步,但功能還不夠完善,不支援資料轉換,序列化等能力,生態相對還比較貧乏。

第二階段:1.0 階段

在 1.0 階段,Open Messaging Connect API 進行了升級,支援 Schema、Transform,Converter 等能力,在此基礎上對 Connect Runtime 也進行了重大升級,對資料轉換,序列化做了支援,複雜Schema也做了完善的支援。該階段的 API、Runtime 能力已經基本完善,在此基礎上,還有30+ Connecotor 實現,覆蓋了 CDC、JDBC、SFTP、NoSQL、快取 Redis、HTTP、AMQP、JMS、資料湖、實時數倉、Replicator、等 Connector 實現,還做了 Kafka Connector Adaptor 可以執行 Kafka 生態的 Connector。

第三階段:2.0 階段

RocketMQ Connect 當前處於這個階段,重點發展 Connector 生態,當 RocketMQ 的 Connector 生態達到 100 + 時,RocketMQ 基本上可以與任意的一個資料系統去做連線。

目前 RocketMQ 社群正在和 OceanBase 社群合作,進行 OceanBase 到 RocketMQ Connect 的研發工作,提供 JDBC 和 CDC 兩種模式接入模式,後續會在社群中釋出,歡迎感興趣的同學試用。

05 總結

RocketMQ 是一個可靠的資料整合元件,具備分散式、伸縮性、故障容錯等能力,可以實現 RocketMQ 與其他資料系統之間的資料流入與流出。透過 RocketMQ Connect 可以實現 CDC,構建資料湖,結合流計算可實現資料價值。

加入 Apache RocketMQ 社群

十年鑄劍,Apache RocketMQ 的成長離不開全球 800+ 位開發者的積極參與貢獻,相信在下個版本你就是 Apache RocketMQ 的貢獻者,在社群不僅可以結識社群大牛,提升技術水平,也可以提升個人影響力,促進自身成長。

社群 5.x 版本正在進行著如火如荼的開發,以及 30 +個 SIG(興趣小組)等你加入,歡迎立志打造世界級分散式系統的同學透過以下方式加入社群:

相關文章