阅读了下YARN的源码,架构中设计模式除了服务生命周期管理模式外,还包括事件驱动和状态机模式。生命周期管理模式在容器设计时候比较常见,包括资源模型的加载,卸载等等,比如tomcat、jboss等开源产品。
这里重点讲一下事件驱动和状态机模式的使用。
从提交任务到任务处理完成,YARN架构中整个任务的处理过程的设计都是事件驱动和状态机器的模式。
对于事件驱动模式,对象包括事件类型EventType、事件对象Event、事件分发器Dispatcher、事件处理器EventHandler,每种事件都有对应的事件处理器注册在Dispatcher中,YARN中的事件分发器AsyncDispatcher是异步处理的事件的(事件发送到queue中,单独线程从队列中取event,根据事件类型取对应的EventHandler进行处理),EventHandler处理逻辑中也可以包括发送下一个事件。
对于状态机模式,基本做法是
根据发生的事件和当前状态,来执行下一步的动作action,并设置下一个状态,参见下图:
YARN中状态机对象StateMachine,涉及的对象包括事件操纵的对象OPERAND(状态机的宿主对象,对应到YARN中的RMAppImpl、RMAppAttemptImpl等等)、状态STATE、事件Event、事件类型EventType。
1、在宿主对象中构造状态机拓扑 StateMachineFactory<RMAppImpl, RMAppState, RMAppEventType, RMAppEvent> stateMachineFactory = new StateMachineFactory<RMAppImpl, RMAppState, RMAppEventType, RMAppEvent>(RMAppState.NEW) .addTransition(RMAppState.NEW, RMAppState.NEW, RMAppEventType.NODE_UPDATE, new RMAppNodeUpdateTransition()) ............... .installTopology(); this.stateMachine = stateMachineFactory.make(this); |
2、在宿主对象中进行状态跳转控制逻辑(宿主对象是特殊的EventHandler) 输入是当前的状态currState和发生的事件Event,经过transition处理后,跳转到下一个状态 this.stateMachine.doTransition(event.getType(), event);
|
3、状态转换处理逻辑,在事件逻辑处理中可以发送事件Event(事件Event由AsyncDispacher异步分发,在EventHandler中调用状态机调整控制逻辑),进行下一次的状态迁移 public interface SingleArcTransition<OPERAND, EVENT> { /** * Transition hook. * * operand the entity attached to the FSM, whose internal * state may change. * event causal event */ public void transition(OPERAND operand, EVENT event); } 参见下图,
|