canal 數(shù)據(jù)消費介紹(3)

系列

canal 組件介紹(1)

canal 啟動介紹(2)

canal 數(shù)據(jù)消費介紹(3)

canal 高可用介紹(4)

canal源碼解析(2)—位點的實現(xiàn)


概述

????要理解canal數(shù)據(jù)消費過程,必須要知道canal的server端是如何響應(yīng)client端的請求的,還記得我們之前說過的么,canal的server其實分為對內(nèi)(CanalServerWithEmbedded)和對外的(CanalServerWithNetty),由CanalServerWithNetty負(fù)責(zé)響應(yīng)client端請求,而后由CanalServerWithEmbedded負(fù)責(zé)進行處理。

? ? server支持的動作包括 subscription(訂閱)、unsubscription(取消訂閱)、get(獲?。?、clientAck(確認(rèn))、clientRollback(回滾)。

? ? CanalServerWithNetty其實底層依賴的是netty,剛好清明的時候把netty大概看了一遍,所以說很多東西都是湊巧,看了不知道以后什么時候會用上。

? ? ok,最后想說的就是,這篇文章其實就想說清楚一個過程,就是client的get/ack/rollback三個過程,講清楚這三個我覺得就夠了。


canal消費流程

canal消費流程

說明

? ? 從上圖可以看出canal的消費其實由client向nettyServer發(fā)起請求,然后轉(zhuǎn)由EmbeddedServer進行處理。


CanalServerWithNetty介紹


nettyServer介紹

CanalServerWithNetty介紹

說明:

? ? 從構(gòu)造函數(shù)可以看出來,在CanalServerWithNetty內(nèi)部其實放入了一個CanalServerWithEmbedded對象,記得這句話,CanalServerWithNetty內(nèi)部通過CanalServerWithEmbedded去完整真正的任務(wù)處理。

? ? 注意bootstrap最后綁定的sessionHandler函數(shù),這是處理函數(shù)的核心。


SessionHandler介紹

SessionHandler介紹

說明

? ??SessionHandler支持上圖中支持的操作,咱們就關(guān)注下GET、CLIENTACK、CLIENTROLLBACK這幾個動作。


GET介紹

????get過程中我們要記得數(shù)據(jù)是從eventStore里面獲取的,eventStore的設(shè)計其實是一個環(huán)狀設(shè)計,可以參考《canal 組件介紹》,在這個基礎(chǔ)上就可以理解了get的過程。

? ? get的過程其實是一個過程,主要是從store獲取數(shù)據(jù),然后記錄消費位移(也就是get位置)到zk節(jié)點,這個記錄其實使用了zk的持久化遞增節(jié)點,這樣子能夠確保我們每次ack的時候按照順序進行g(shù)et。

? ? 記錄到zk的position位置包括三個關(guān)鍵位移,包括start、ack、end,至于這幾個有什么用,暫時我也不清楚,應(yīng)該就是你獲取的這批數(shù)據(jù)的開始位移(start)、結(jié)束位移(end)、確認(rèn)位移(ack)。

? ? 記錄的位移的zk節(jié)點目錄是 /otter/canal/destinations/xxxx/clientId/mark/00000000-00000011,其中xxxx是instance的名字代表同步的數(shù)據(jù),clientId代表啟動的client端。


RingBuffer的設(shè)計
get操作-1
get操作-2
get操作-3
get-4


CLIENTACK介紹

????ack過程其實就是就是client端發(fā)送ack消息體到server,server根據(jù)ack消息體里面的batchId和clientId去找到get數(shù)據(jù)時候獲取上次記錄的位移,通過刪除記錄節(jié)點并記錄到新的zk節(jié)點完成ack確認(rèn),其實我們理解為就是我們刪除了待ack的數(shù)據(jù)代表就完成了ack。

????記錄的位移的zk節(jié)點目錄是 /otter/canal/destinations/xxxx/clientId/mark/00000000-00000011,其中xxxx是instance的名字代表同步的數(shù)據(jù),clientId代表啟動的client端,這個目錄我們可以理解消費過程的記錄。

? ? 最后我們會用單個節(jié)點記錄消費位移,位置/otter/canal/destinations/xxxx/clientId/cursor,這個我們可以理解為最終結(jié)果的位移。

clientAck-1


clientAck-2


CLIENTROLLBACK介紹

????clientRollback的過程其實就是移動位移的過程,也就是在環(huán)形數(shù)據(jù)的get位移恢復(fù)到rollback的位置,再次強調(diào)一下重點,說三遍。

? ? rollback其實就是一個移動下標(biāo)的過程而已。

? ? rollback其實就是一個移動下標(biāo)的過程而已。

? ? rollback其實就是一個移動下標(biāo)的過程而已。

clientRollback-1


clientRollback-2


clientRollback-3
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容