云原生事件驅(qū)動(dòng)組件之DIP

事件驅(qū)動(dòng)架構(gòu)思想一直是軟件架構(gòu)領(lǐng)域非常重要的一種設(shè)計(jì)思想,每一次架構(gòu)浪潮下都會(huì)被提起。
DDD 時(shí)代,怎么解決兩個(gè)領(lǐng)域下通信問題呢?事件驅(qū)動(dòng)。
ESB 時(shí)代,事件總線就是非常重要的概念。
微服務(wù)時(shí)代,異步通信/MQ更是被廣泛使用。
云原生時(shí)代了,事件驅(qū)動(dòng)架構(gòu)模式再次被提起,變成了云服務(wù)下的一個(gè)云原生產(chǎn)品了。
為了更好地理解云原生,了解云原生事件驅(qū)動(dòng)產(chǎn)品的價(jià)值就是很好的一個(gè)切入點(diǎn)。
今天介紹的云原生事件驅(qū)動(dòng)產(chǎn)品是DIP,主要解決的是云原生時(shí)代數(shù)據(jù)集成的問題。
隨著移動(dòng)互聯(lián)網(wǎng)發(fā)展、數(shù)據(jù)量爆炸,圍繞于數(shù)據(jù)接入、處理、清洗、展現(xiàn)的技術(shù)組件就不斷在發(fā)展。
一個(gè)經(jīng)典的數(shù)據(jù)鏈路架構(gòu)圖如下:

從數(shù)據(jù)源、數(shù)據(jù)接入、數(shù)據(jù)緩沖、數(shù)據(jù)目標(biāo),整個(gè)鏈路非常復(fù)雜。
云原生時(shí)代下,數(shù)據(jù)集成的新訴求是:SaaS 化、低代碼、簡(jiǎn)單、可靠、高性能、按需付費(fèi)。
DIP 是騰訊云的一款數(shù)據(jù)接入平臺(tái),目的是構(gòu)建數(shù)據(jù)源和數(shù)據(jù)處理系統(tǒng)之間的橋梁。
定位是云上 SaaS 數(shù)據(jù)接入與處理平臺(tái),幫助客戶一站式實(shí)現(xiàn)數(shù)據(jù)接入、處理、分發(fā)。
DIP 可以實(shí)現(xiàn) Http/Tcp 協(xié)議的 SDK 數(shù)據(jù)上報(bào)、數(shù)據(jù)變更訂閱機(jī)制、支持多種存儲(chǔ)數(shù)據(jù)庫。
DIP 類似于傳統(tǒng)大數(shù)據(jù)解決方案中的 Kafka+Flink 的角色,但不能完全替代 Flink,只能解決一些通用數(shù)據(jù)接入場(chǎng)景,而復(fù)雜的數(shù)據(jù)處理還需要依賴于 Flink 流式計(jì)算實(shí)現(xiàn)。
DIP 是基于 Kafka 實(shí)現(xiàn)的,Kafka 定位于存儲(chǔ)層,DIP 定位于分發(fā)平臺(tái),在 Kafka 基礎(chǔ)上多了接入層與分發(fā)層。
Kafka 屬于 PaaS 層能力,DIP 屬于 SaaS 層能力,通過低代碼、Serverless 方式,實(shí)現(xiàn)一站式數(shù)據(jù)鏈路搭建,免運(yùn)維的效果。

接下來看下 DIP 是如何解決過去的一些高頻數(shù)據(jù)處理場(chǎng)景的。
日常開發(fā)中,經(jīng)常遇到一些比較簡(jiǎn)單的數(shù)據(jù)統(tǒng)一上報(bào)的需求,比如監(jiān)控?cái)?shù)據(jù)、用戶行為數(shù)據(jù)、APP 操作數(shù)據(jù)等。需要將端到端的數(shù)據(jù)統(tǒng)一收集到服務(wù)端,供業(yè)務(wù)查詢、處理、分析。
一般情況下,這些上報(bào)的數(shù)據(jù)需要存儲(chǔ)到下游的分析系統(tǒng)里面(比如 ES、HDFS、Hive、數(shù)據(jù)湖等),再進(jìn)行下一步處理。
但以上這些基礎(chǔ)設(shè)施屬于大數(shù)據(jù)相關(guān)組件,需要做數(shù)據(jù)接收、處理任務(wù)編寫、存儲(chǔ)等工作,對(duì)于研發(fā)人員和產(chǎn)品人員學(xué)習(xí)成本高,不夠友好。同時(shí)大數(shù)據(jù)組件往往屬于多租戶產(chǎn)品,擴(kuò)容難度大、成本高也不夠靈活。
DIP 通過 SaaS 思路解決這個(gè)問題,通過簡(jiǎn)單的界面配置+SDK 上報(bào)方式,實(shí)現(xiàn)整個(gè)數(shù)據(jù)采集鏈路的搭建,簡(jiǎn)化了數(shù)據(jù)上報(bào)、處理、展示的閉環(huán),降低了研發(fā)成本。

數(shù)據(jù)上報(bào)端,提供多種上報(bào) SDK,屏蔽了上報(bào)協(xié)議和多種 MQ 存儲(chǔ)協(xié)議的復(fù)雜性與差異性。

另一種數(shù)據(jù)集成常見的需求是監(jiān)聽 mysql 的 binlog,這種情況往往需要研發(fā)搭建自定義的數(shù)據(jù)變更訂閱組件,比如基于 canal、databus 等。
而基于 DIP 提供的 SaaS 組件,通過界面配置的方式即可完成對(duì) Mysql 的數(shù)據(jù)訂閱、處理、轉(zhuǎn)儲(chǔ)等流程。

另一種常見的數(shù)據(jù)常見是數(shù)據(jù)的清洗與分發(fā)。比如數(shù)據(jù)接入之后,只需要簡(jiǎn)單的處理、過濾、歸并,再做下一步的存儲(chǔ)、轉(zhuǎn)發(fā)、分析、查詢。
過去,對(duì)于這個(gè)問題,需要下把預(yù)處理數(shù)據(jù)落存儲(chǔ),比如存儲(chǔ)到 ES 或者 HDFS,然后自己寫個(gè) Flink 的任務(wù),做過程清洗。成本高、效率低。
如果使用 DIP,可以通過提供的產(chǎn)品配置,完成一鍵配置,低代碼方式實(shí)現(xiàn)數(shù)據(jù)的過濾和清洗。

還有一種場(chǎng)景,是多個(gè)數(shù)據(jù)源的歸并處理。比如有的數(shù)據(jù)來源于 SDK 上報(bào),有的來源于 Kafka,有的是 MySql 的 binlog。過去對(duì)于這種問題,同樣需要數(shù)據(jù)轉(zhuǎn)儲(chǔ)、分析、再處理,整個(gè)鏈路就比較長(zhǎng)。
DIP 同樣可以通過簡(jiǎn)單的配置,實(shí)現(xiàn)對(duì)多個(gè)數(shù)據(jù)源的接入。

DIP 整體架構(gòu)上,分為兩層,一層是數(shù)據(jù)面、一層是管控面。
管控面圍繞于資源管理、監(jiān)控調(diào)度、自動(dòng)擴(kuò)縮容、遷移管理、配置告警等。
數(shù)據(jù)面圍繞于數(shù)據(jù)流轉(zhuǎn)的鏈路,分為數(shù)據(jù)接入、數(shù)據(jù)處理、數(shù)據(jù)流出三部分。

數(shù)據(jù)接入方式上,主要有三種:主動(dòng)訂閱、數(shù)據(jù)上報(bào)、跨云數(shù)據(jù)獲取。
數(shù)據(jù)接入模塊也有三類,一類是 mysql 、nosql這樣的服務(wù)類數(shù)據(jù)上報(bào);
一類是日志采集器;
一類是 http 的主動(dòng)上報(bào);
對(duì)于前兩類,可以通過產(chǎn)品化配置界面,拖拉拽的方式快速配置數(shù)據(jù)鏈路,而無需關(guān)注底層實(shí)現(xiàn)。第三類則需要引入 DIP 的 sdk 作為數(shù)據(jù)接入點(diǎn),有一定的侵入性和開發(fā)成本,但數(shù)據(jù)上報(bào)更靈活。
DIP 平臺(tái)支持任務(wù)編排,在控制臺(tái)上可以看到數(shù)據(jù)流轉(zhuǎn)鏈路,比如數(shù)據(jù)源情況、轉(zhuǎn)儲(chǔ)處理、任務(wù)投遞、數(shù)據(jù)詳情等。通過編排方式可以增加或刪除鏈路上的節(jié)點(diǎn),做定制的數(shù)據(jù)處理鏈路。
DIP 架構(gòu)上深度集成了 Kafka,通過 kafka 的 connector 將不同的數(shù)據(jù)源數(shù)據(jù)導(dǎo)進(jìn)來。對(duì)于 http 數(shù)據(jù)上報(bào),是通過 SDK 實(shí)現(xiàn)。本質(zhì)是將 http 上報(bào)的數(shù)據(jù)放到 kafka 的 producer,導(dǎo)入到隊(duì)列中,借助于 kafka 實(shí)現(xiàn)高可用、自動(dòng)恢復(fù)、擴(kuò)縮容等能力,提升穩(wěn)定性。

接下來,再看下DIP接入的一些案例。
多場(chǎng)景數(shù)據(jù)上報(bào):將 web 端、移動(dòng)端多種數(shù)據(jù)源上報(bào),做檢索查詢。
自定義代碼,引入 sdk,進(jìn)行業(yè)務(wù)邏輯處理;
原始數(shù)據(jù)進(jìn)入 ES 便于數(shù)據(jù)檢索;

數(shù)據(jù)處理分發(fā):采集服務(wù)日志,放入 es 做檢索,部分?jǐn)?shù)據(jù)清洗處理后,存儲(chǔ)到 hdfs 持久化。
同一套數(shù)據(jù)源通過 kafka 上報(bào),基于 DIP 實(shí)現(xiàn)不同需求的數(shù)據(jù)分發(fā)(用于檢索、持久化、fink 計(jì)算)

數(shù)據(jù)訂閱:多套存儲(chǔ)引擎中數(shù)據(jù)導(dǎo)入 ES 進(jìn)行檢索查詢。
數(shù)據(jù)寫入 ES 時(shí)跟進(jìn)時(shí)間分索引;
數(shù)據(jù)量大,需要做一定的數(shù)據(jù)精簡(jiǎn);
根據(jù)不同的表,將數(shù)據(jù)分發(fā)到不同的索引中;
原始架構(gòu)鏈路:PGSQL + Debezium PGSQL + kafka connector + kafka + logstash + ESDIP架構(gòu)鏈路:PGSQL + DIP + ES

http 數(shù)據(jù)接入 MQ:
簡(jiǎn)化客戶端使用,最好用兼容性較好的 http 協(xié)議;
底層 MQ 引擎切換業(yè)務(wù)無感;
支持現(xiàn)有的 Http 協(xié)議 SDK;

數(shù)據(jù)接入數(shù)據(jù)湖:多種數(shù)據(jù)源數(shù)據(jù)共同存儲(chǔ)到數(shù)據(jù)湖。

希望通過對(duì)DIP的介紹,能幫助你在頭腦中形成一個(gè)云原生時(shí)代,基礎(chǔ)架構(gòu)組件產(chǎn)品的全貌,幫助你看待及設(shè)計(jì)適用于云原生時(shí)代的技術(shù)組件。
