深入理解重要的编程模型:事件驱动,消息驱动,数据驱动
文章目录1、背景2、共性3、事件驱动架构EDA3.1、中介(mediator)结构4、深入理解事件驱动详细解析事件驱动的缺点5、事件驱动架构模型评估1、背景模型是对事物共性的抽象编程模型就是对编程的共性的抽象。2、共性最重要的共性就是程序设计时代码的抽象方式、组织方式或复用方式。编程模型主要是方法与思想。编程模型处于方法或思想性的层面在很多情况下也可称为编程方法、编程方式、编程模式或编程技术、编程范式。当面对一个新问题时通常的想法是通过分析不断的转化和转换得到本质相同的熟悉的、或抽象的、简单的一个问题这就是化归思想。把初始的问题或对象称为原型(prototype)把化归后的相对定型的模拟化或理想化的对象称为模型。3、事件驱动架构EDA事件驱动架构Event-Driven Architecture是一种用于设计应用的软件架构和模型程序的执行流由外部事件来决定它的特点是包含一个事件循环当外部事件发生时使用回调机制来触发相应的处理。事件驱动架构定义1、异步分发事件架构模式2、由高度解构、单一目的组件构成这些组件负责异步事件的接收和事件处理3、有两种主要的拓扑结构中介(mediator)拓扑结构和代理(broker)拓扑结构3.1、中介(mediator)结构主要包括 4 个基本组件序号组件含义1事件队列event queue接收客户端发送的事件形成队列然后发送给事件中介2事件中介接受原始事件事件分配协调处理创建待处理事件将不同的待处理事件发给对应的事件通道3事件通道event channel接收经过协调处理过的单一事件4事件处理器event processor执行具体的事件逻辑(1. 处理特定的待处理事件只完成唯一的任务2. 可独立运作高度解耦不依赖其他事件处理器)流程图直观展示中介拓扑结构中各组件的数据流向与协作关系1. 发送原始事件2. 按序投递3a. 转换/编排为事件A3b. 转换/编排为事件B4a. 分发4b. 分发5. 执行业务逻辑5. 执行业务逻辑客户端/事件源事件队列事件中介事件通道 A事件通道 B事件处理器 A事件处理器 B数据库/外部服务缓存/存储核心特点1、松耦合——服务不需要(也不应该)知道或依赖于其他服务。在使用事件时服务独立运行不了解其他服务包括其实现细节和传输协议。事件模型下的服务可以独立地、更容易地更新、测试和部署。2、易扩展——通过高度独立和解耦的事件处理器自然地实现了可扩展性。每个事件处理器都可以单独扩展从而实现细粒度的可扩展性。3、恢复支持——带有队列的事件驱动架构可以通过“重播”过去的事件来恢复丢失的工作。当用户需要恢复时这对于防止数据丢失非常有用。事件驱动架构可以最大程度减少耦合度因此是现代化分布式应用架构的理想之选。4、深入理解事件驱动详细解析1.异步处理和主动轮询要理解事件驱动和程序就需要与非事件驱动的程序进行比较。实际上现代的程序大多是事件驱动的比如多线程的程序肯定是事件驱动的。早期则存在许多非事件驱动的程序这样的程序在需要等待某个条件触发时会不断地检查这个条件直到条件满足这是很浪费cpu时间的。而事件驱动的程序则有机会释放cpu从而进入睡眠态注意是有机会当然程序也可自行决定不释放cpu当事件触发时被操作系统唤醒这样就能更加有效地使用cpu。2.IO模型事件驱动框架一般是采用Reactor模式或者Proactor模式的IO模型。3.事件队列事件驱动的程序必定会直接或者间接拥有一个事件队列用于存储未能及时处理的事件这个事件队列可以采用消息队列。4.事件串联事件驱动的程序的行为完全受外部输入的事件控制所以事件驱动框架中存在大量处理程序逻辑可以通过事件把各个处理流程关联起来。5.顺序性和原子化事件驱动的程序可以按照一定的顺序处理队列中的事件而这个顺序则是由事件的触发顺序决定的这一特性往往被用于保证某些过程的顺序性和原子化。事件驱动的缺点1、事件驱动架构就是通过引入中间层来实现事件发布-订阅机制进行组件解耦看似能带来不少诱人的优点也必然会增加系统的复杂度间接增加开发难度和维护难度。2、事件驱动架构改变了编程思维将完整的功能过程拆解为了不同的异步事件处理也丧失了连贯的流程处理能力。5、事件驱动架构模型评估为了更全面地评估事件驱动架构下图展示其在灵活性、性能与开发复杂度之间的权衡关系事件驱动架构评估维度对比灵活性易部署性性能伸缩性可测性易开发性109876543210评分 (0-10)评估点评估值简述整体灵活性高事件处理器组件相互独立不相关联对应变化整体架构不变对应事件处理器发生变化即可易部署性高中介或代理与事件处理器都可以分散式部署性能高高度解耦异步并行操作大大减少了传递消息过程中带来的事件开销伸缩性高事件处理器能够进行细粒度的拓展每一个事件处理器都能单独被拓展而不影响其他事件处理器可测性低事件驱动架构模式是异步进行事件分发的其异步处理的特性为单元测试带来了一定的困难易开发性低开发需要考虑异步处理机制/协议创建流程、事件异常处理等开发门槛高