博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
事件驱动和状态机模式在YARN中的使用
阅读量:6953 次
发布时间:2019-06-27

本文共 1508 字,大约阅读时间需要 5 分钟。

  hot3.png

阅读了下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.

   * 

   *   operand the entity attached to the FSM, whose internal 

   *                state may change.

   *   event causal event

   */

  public void transition(OPERAND operand, EVENT event);

}

参见下图,

 

转载于:https://my.oschina.net/psuyun/blog/304662

你可能感兴趣的文章
Ubuntu 重启 Nginx 失败,* Restarting nginx nginx ...fail!
查看>>
pip下载默认绕过代理
查看>>
nginx 常用配置
查看>>
qq强制聊天工具
查看>>
.net(c#) winform文本框只能输入数字,不能其他非法字符
查看>>
微软职位内部推荐-Software Development Engineer
查看>>
ruby异常处理
查看>>
【转】测试架构师团队的管理
查看>>
DataList同时选定删除多项
查看>>
利用Fiddler或Charles进行mock数据
查看>>
信仰1056
查看>>
ORACLE 数据库查询指定表的主键外键
查看>>
二进制的负数转换
查看>>
后端&前端零碎知识点和注意问题
查看>>
二维数组名和指针
查看>>
今天myeclipse 下的tomcat又起不来了。。。
查看>>
TreaponseHeader
查看>>
2019春总结作业
查看>>
js中call、apply、bind的用法
查看>>
博客开通了。。。
查看>>