Kylin 广播机制流程、源码分析-触发autoMerge segments为例

从用户触发Build cube 到build 完成触发实体"cube"广播一整个流程源码追踪。

用户提交Build cube请求
——》Kylin生成相关Job并持久化([参见Kylin Cube 构建源码分析-生成job并持久化](https://blog.csdn.net/wangxiaojing123/article/details/89060673))
——》Kylin build引擎开始执行刚刚提交的job
——》执行job中的createUpdateCubeInfoAfterBuildStep这一步
——》UpdateCubeInfoAfterBuildStep.doWork
——》cubeManager.promoteNewlyBuiltSegments(cube, segment)
——》cubeManager.updateCubeWithRetry——》CachedCrudAssist.save
——》SingleValueCache.put——》Broadcaster.announce(添加到事件队列broadcastEvents中("cube","update",本次build的cube的名称如"es_report_respnse_rate_cube"))
——》Broadcaster私有构造方法中消费事件队列
  • Step1:Kylin生成相关Job并持久化
    在这里插入图片描述
  • Step2: Kylin build引擎开始执行刚刚提交的job:
    与autoMerge segments相关主要是job中createUpdateCubeInfoAfterBuildStep这一步
    在这里插入图片描述
  • Step3: cubeManager.promoteNewlyBuiltSegments
    在这里插入图片描述
    继续追踪
    在这里插入图片描述
    在这里插入图片描述
    继续追踪
    在这里插入图片描述

Step4: CachedCrudAssist.save方法:
在这里插入图片描述

  • step5: cache.put方法
syncEntity:cube 
type:update
key:本次build的cube的名称如"es_report_respnse_rate_cube"

在这里插入图片描述
cubeManger实例化代码,贴出这张图主要是交代这个缓存的实体为cube
在这里插入图片描述
Step6:放入事件队列
在这里插入图片描述

  • Step7: 消费事件队列
    Broadcaster的私有构造方法(单例模式),启动一个线程一直轮训事件队列,用于消费事件队列
    在这里插入图片描述

实际就是通过http通知目的节点,调用其cacheController中的cache方法
在这里插入图片描述

  • Step8: 目标节点的CacheController
    在这里插入图片描述
    继续追踪:cacheService.notifyMetadataChange方法
    在这里插入图片描述
    继续追踪
    在这里插入图片描述
  • Step9: 真正执行各个监听器的代码:
调用Broadcaster.notifyListener(String entity, Event event, String cacheKey, boolean includeStatic)方法

在这里插入图片描述

  • Step10: 接下来咱们看下哪些listener注册了实体"cube"的监听,即listenerMap和staticListenerMap中key=cube的有哪些
    在这里插入图片描述
    注册了静态staticListenerMap的listener:
    在这里插入图片描述
    注册了普通staticListenerMap的listener:
    在这里插入图片描述
    通过上面两图咱们知道注册了"cube"实体的listener如下:
/*这些listner多时在tomcat启动的时候或者第一次实例化的时候放入listenerMap和staticListenerMap中,
具体可以参考 https://blog.csdn.net/wangxiaojing123/article/details/90451660 */

listenerMap: CubeSyncListener、HybridSyncListener;
staticListenerMap:cacheSyncListener(CacheService中cacheSyncListener=new Broadcaster.Listener())、HTableInfoSyncListener、CuboidRecommenderSyncListener。

找到了对应实体”cube“的监听方法,咱们只需要看这些listener对应的方法即可:接下来咱们主要看下cubeService中注册的静态listener中的cacheSyncListener.onEntityChange方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
keepCubeRetention方法:
在这里插入图片描述
mergeCubeSegment方法:
在这里插入图片描述
后续的执行就和普通的job一样,参照调度引擎调度job执行。至此触发autoMerge segments为例的一个广播机制全部流程分析完成。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值