事件代表过去发生的事件,事件既是技术架构概念,也是业务概念。以事件为驱动的编程模型称为事件驱动架构EDA。

  EDA是一种以事件为媒介,实现组件或服务之间最大松耦合的方式。传统面向接口编程是以接口为媒介,实现调用接口者和接口实现者之间的解耦,但是这种解耦程度不是很高,如果接口发生变化,双方代码都需要变动,而事件驱动则是调用者和被调用者互相不知道对方,两者只和中间消息队列耦合。

  事件驱动有以下特征:

  1. 生产者producer发生实时事件
  2. 推送通知
  3. 生产者发射即完成fire-and -orget
  4. 消费者consumer立即响应
  5. 事件与命令是有区别的

  借助消息系统异步模型的特点,事件驱动也有异步特征,传统方法调用比如调用b.xxmethod()是一种同步模型,这时必须等待b的方法执行完才能继续执行其他代码,RPC远程方法调用也是一种同步模型,而对于异步模型来说,事件生产者发出事件后,不必等待回应,可以继续执行下面的代码。

  但是不代表使用了消息系统的架构都是EDA,SOA面向服务驱动的架构中也使用消息系统作为ESB,两者使用方式不同,三种不同交互方式:

  1. 时间驱动:比如cron定时计划执行
  2. 请求驱动:客户端和服务器端之间,常见SOA
  3. .事件驱动:以事件为特征。实时。

  请求驱动+消息系统和事件驱动+消息系统有本质区别,前者是由请求者作为消息生产者,主要目的是为了得到响应,因此是一种请求响应模型;而后者重点是在消息消费者,不是在消息生产者,业务逻辑站在消费者角度完成,业务逻辑的完成靠事件驱动来执行,而前者业务逻辑是在消息生产者完成,当业务逻辑中需要什么依赖或资源,依靠发送消息来拉取完成。这两种区别本质是拉Poll和推Push的区别。

  正是因为EDA这种和传统SOA的本质区别,现在诞生一种领域EDA,其中包括CQRSEventSourcing 领域事件等等。同时,传统的SOA将业务领域逻辑切分成不同系统,对外表现为服务,这种方式导致业务逻辑跨越多个系统,导致业务逻辑散落各处,寻找维护不方便,造成业务逻辑的污染和膨胀。

  使用EDA改造传统SOA,比如,如果一个报表系统想知道交易系统的状态,它不是发送一个消息给交易系统,拉取它当前的状态,而是向事件总线订阅,这样当交易系统有状态报告时,将发出事件通知报表系统。

  EDA的可扩展性和吞吐量上要强于传统SOA,EDA类似组装生产线,下图对于一个顺序线性的处理过程,6个步骤分别是接受 确认 保存 产生PDF 发送Email 输出展现,花去365ms:

而组装线的EDA方式,总是询问着6步中是否可以让别人协同帮助完成?其中第4步和第5步是可以的,因此整个处理时间提升到115ms,提升了70%的响应时间:

详细的组装线如下,这实际也是一种SEDA,Staged EDA:

  最终我们可以完成一个新的基于领域事件的D-EDA+SOA架构如下:

EDA 事件驱动框架的更多相关文章

  1. 【Nginx】事件驱动框架和异步处理

    Nginx对请求的处理是通过事件触发的,模块作为事件消费者,仅仅能被事件收集.分发器调用.这与传统的Webserver是不同的. 传统的Webserver下,一个请求由一个进程消费.请求在建立连接后将 ...

  2. 【Redis】事件驱动框架源码分析

    aeEventLoop初始化 在server.c文件的initServer函数中,对aeEventLoop进行了初始化: 调用aeCreateEventLoop函数创建aeEventLoop结构体,对 ...

  3. 【Redis】事件驱动框架源码分析(单线程)

    aeEventLoop初始化 在server.c文件的initServer函数中,对aeEventLoop进行了初始化: 调用aeCreateEventLoop函数创建aeEventLoop结构体,对 ...

  4. 基于Spring Cloud Netflix的TCC柔性事务和EDA事件驱动示例

    Solar Spring Cloud为开发者提供了快速构建分布式系统中的一些常见工具,如分布式配置中心,服务发现与注册中心,智能路由,服务熔断及降级,消息总线,分布式追踪的解决方案等. 本次实战以模拟 ...

  5. 事件驱动框架EventNext之线程容器

    EventNext是.net core下的一个事件驱动的应用框架,通过它代理创建的接口行为都是通过事件驱动的模式进行调用.由于EventNext的所有调用都是基于事件队列来进行,所以在资源控制上非常方 ...

  6. 【Redis】事件驱动框架源码分析(多线程)

    IO线程初始化 Redis在6.0版本中引入了多线程,提高IO请求处理效率. 在Redis Server启动函数main(server.c文件)中初始化服务之后,又调用了InitServerLast函 ...

  7. EDA: Event-Driven Architecture事件驱动架构

    EDA: Event-Driven Architecture事件驱动架构 2009-09-24 17:28 5 赞  异步编程      软件架构      EDA事件驱动        SOA的核心 ...

  8. IDDD 实现领域驱动设计-CQRS(命令查询职责分离)和 EDA(事件驱动架构)

    上一篇:<IDDD 实现领域驱动设计-SOA.REST 和六边形架构> 阅读目录: CQRS-命令查询职责分离 EDA-事件驱动架构 Domin Event-领域事件 Long-Runni ...

  9. 事件驱动之Twsited异步网络框架

    在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...

随机推荐

  1. ios中判断当前手机的网络状态

    typedef enum {    NETWORK_TYPE_NONE= 0,    NETWORK_TYPE_2G= 1,    NETWORK_TYPE_3G= 2,    NETWORK_TYP ...

  2. CDOJ 1324 卿学姐与公主 分块

    题目地址 分块模板 #include<cstdio> #include<algorithm> #include<math.h> using namespace st ...

  3. Python 正则表达式学习笔记

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...

  4. HDU - 5455 Fang Fang

    Problem Description Fang Fang says she wants to be remembered.I promise her. We define the sequence  ...

  5. POJ 2239 Selecting Courses

    二分图的最大匹配.课程和时间可以看做二分图. #include<cstdio> #include<cstring> #include<cmath> #include ...

  6. js通过keyCode值判断单击键盘上某个键,然后触发指定的事件

    当单击按键时触发事件    document.onkeydown = function (e) {             e = e || event;             if (e.keyC ...

  7. JavaScript高级程序设计:第二章

    在HTML中使用JavaScript 1.<script>元素:向HTML页面中插入JavaScript的主要方法就是使用<scritp>元素.HTML4.01为<scr ...

  8. 模拟post请求-->测试api是否可用-->再交给ios开发

    提交给iso开发前.先模拟post提交,测试返回是否正确 =============post.php文件 ios每次最少要提交5个数据, 加密串 seqno , 请求验证码 source, 设备唯一标 ...

  9. LeetCode OJ 100. Same Tree

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  10. Office Web Apps 错误

    owa安装完后,在sharepoint网站上打开word,excel,报错,Sorry, something went wrong, 通过correlation id找到错误信息(如何在sharepo ...