Kylin 廣播機制流程、源碼分析——Broadcaster

Kylin的廣播機制在整個Kylin集羣中作用非常重大,各個節點之間的數據同步均是通過廣播機制進行。
1、Project/Model/Cube的元數據信息變化,由Broadcaster通過api的形式廣播通知其他節點;
2、build完成後觸發auto merge等。

廣播機制大致流程:

  • 1、註冊事件監聽器:
Tomcat啓動後執行相關類的afterPropertiesSet方法,註冊相關事件到Broadcaster中的listenerMap和staticListenerMap 兩個容器中。
其中listenerMap存放普通的監聽事件實體類型及其對應的listener,
staticListenerMap存放靜態的監聽事件實體類型和其listener;
(文中會具體將何時如何存放)

在這裏插入圖片描述
listenerMap和staticListenMap的key均爲實體類型,value是具體的監聽器List:

//listenerMap和staticListenMap內容示例
<"execute",list(new JobSyncListener())>
<"execute_output",list(new JobOutputSyncListener())>
<"all",list(new JobSyncListener(),new JobOutputSyncListener())>
<"project_schema",,list(new JobSyncListener(),new <"project_data",,list(new JobSyncListener(),new JobOutputSyncListener())>
<"project_acl",,list(new JobSyncListener(),new JobOutputSyncListener())>
.....

所有註冊listenerMap監聽器的代碼:
在這裏插入圖片描述
所有註冊staticListenMap監聽器的代碼:
在這裏插入圖片描述
上面兩圖中的這些類通常均爲單例類型,在第一次實例化的時候執行註冊相關事件監聽器,有的是被其他類的afterPropertiesSet觸發,有的則是從其他方法觸發,總之均是在實例化的時候註冊且只初始化一次。

//以execute、execute_output相關事體的監聽註冊爲例
JobService.afterPropertiesSet()——》scheduler.init——》ExecutableManager.getInstance——》ExecutableDao.getInstance——》ExecutableDao構造方法——》ExecutableDao的構造方法會註冊execute、execute_output等實體。
//

在這裏插入圖片描述

  • 2、事件放入事件隊列
可以觸發事件的地方有很多,比如project/cube/mode update ,cube build 等。
他們最終都是在持久化的時候將相關事件放入事件隊列(broadcastEvents),
調用方法棧:CachedCrudAssist.save——》SingleValueCache.put——》Broadcaster.announce——》存入待處理的事件隊列(broadcastEvents)中。

在這裏插入圖片描述

  • 3、觸發事件隊列
Broadcaster第一次被實例化時(只會被實例化一次)構造方法中會啓動一個後臺線程一直輪訓,
依次從事件隊列(broadcastEvents)中取出事件並執行相關方法(實際就是restfull api調用)

Broadcaster私有構造方法前半部分:在這裏插入圖片描述
Broadcaster私有構造方法後半部分:
在這裏插入圖片描述
Restclient.wipeCache方法:
在這裏插入圖片描述
4、目的節點執行
實際調用的是目的節點CacheController的如下兩個方法:
在這裏插入圖片描述
最終均調用CacheService.notifyMetadataChange方法:
在這裏插入圖片描述
繼續向下調用,true表示需要執行靜態staticListenerMap:
在這裏插入圖片描述
在這裏插入圖片描述
接下來就是去執行各個註冊在staticListenerMap和listenerMap中相關具體方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章