海豚调度活动图解析
最近在看dolphinScheduler的源码,还是很经典的
一、架构图
二、活动图
3.1.master分配任务给worker
3.1.1.主线
MasterServer启动NettyRemotingServer,MasterSchedulerService,QuartzExecutors,ZKMasterClient
MasterSchedulerService构造了ThreadPoolExecutor线程池
ThreadPoolExecutor线程池执行MasterExecThread(对应一个任务流)
MasterExecThread将任务流构造出一张task构成的DAG,并将task写入PriorityQueue
3.1.2.消费支线-对象初始化后启动
TaskPriorityQueueConsumer从PriorityQueue获取task,调用ExecutorDispatcher
ExecutorDispatcher调用NettyExecutorManager
NettyExecutorManager调用NettyRemotingClient.send()发送到worker
3.1.3.调度支线
QuartzExecutors启动Scheduler
Scheduler接收从API提交的调度任务
3.1.4.DB支线
TaskResponseService初始化后启动一个TaskResponseWorker线程
TaskResponseWorker负责将eventQueue中的事件进行持久化,并向channel发送一条信息,分两种情况:
ACK:发送DBTaskAckCommand
Response:发送DBTaskResponseCommand
3.1.5.处理器
master中的NettyRemotingServer有三个processor:task回复、task-确认,task-kill回复
TaskResponseProcessor:将信息更新到eventQueue
TaskAckProcessor:将信息更新到eventQueue
TaskKillResponseProcessor:打印一条日志
3.1.6.竞选master
ZKMasterClient
3.2.worker接收任务
3.2.1.主线
WorkerServer.run()启动NettyRemotingServer,WorkerManagerThread,RetryReportTaskStatusThread,WorkerRegistry(将自己注册到zookeeper)
WorkerManagerThread从workerExecuteQueue获取TaskExecuteThread并执行
TaskExecuteThread.run()进行AbstractTask.handle()处理,处理完后调用TaskCallbackService.sendResult()中的NettyRemoteChannel发送responseCommand消息给master
3.2.2.执行任务支线
NettyRemotingServer注册NettyServerHandler
NettyServerHandler.processReceived()处理从Master接收到的command,根据type得到不同的processor
TaskExecuteProcessor执行process()方法,调用TaskCallbackService
TaskCallbackService执行NettyRemoteChannel发送task:ack消息给master
3.2.3.处理器
worker里的NettyRemotingServer有4个processor:task-execute请求、task-kill请求、db-确认、db-回复
TaskExecuteProcessor:初始化taskExecutionContext,创建一条新channel,发送master一条ACK信息,并将command加入到workerExecuteQueue
TaskKillProcessor:杀掉进程,并给master发送一条taskKillResponseCommand
DBTaskAckProcessor:如果taskAckCommand状态成功,从缓存中删除对应taskID
DBTaskResponseProcessor:如果taskResponseCommand状态为成功,从缓存中删除taskID
3.2.4.杀掉线程请求
TaskKillProcessor.process()调用WorkerManagerThread.killTaskBeforeExecuteByInstanceId()发送responseCommand给master
3.2.5.执行线程请求
TaskExecuteProcessor调用TaskCallbackService.sendAck()中的NettyRemoteChannel发送消息给master
3.2.6.重试线程
RetryReportTaskStatusThread不断从缓存读command信息,调用TaskCallbackService.sendResult()/sendAck()发送消息给master
3.2.7.注册zookeeper
WorkerRegistry将自己注册到zookeeper
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端