事件驱动和状态机模式在YARN中的使用

来源:互联网 发布:mysql 创建联合索引 编辑:程序博客网 时间:2024/06/10 20:58

阅读了下YARN的源码,架构中设计模式除了服务生命周期管理模式外,还包括事件驱动和状态机模式。生命周期管理模式在容器设计时候比较常见,包括资源模型的加载,卸载等等,比如tomcatjboss等开源产品。

这里重点讲一下事件驱动和状态机模式的使用。

从提交任务到任务处理完成,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_UPDATEnew RMAppNodeUpdateTransition())

...............

     .installTopology();

 this.stateMachine = stateMachineFactory.make(this); 

 

2、在宿主对象中进行状态跳转控制逻辑(宿主对象是特殊的EventHandler)

输入是当前的状态currState和发生的事件Event,经过transition处理后,跳转到下一个状态

  this.stateMachine.doTransition(event.getType(), event);

 

3、状态转换处理逻辑,在事件逻辑处理中可以发送事件Event(事件EventAsyncDispacher异步分发,在EventHandler中调用状态机调整控制逻辑),进行下一次的状态迁移

public interface SingleArcTransition<OPERAND, EVENT> {

  /**

   * Transition hook.

   * 

   * @param operand the entity attached to the FSM, whose internal 

   *                state may change.

   * @param event causal event

   */

  public void transition(OPERAND operand, EVENT event);

}

参见下图,