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中相關具體方法。