喜欢的朋友可以关注下专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。

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

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

事件驱动有以下特征:

生产者producer发生实时事件

推送通知

生产者发射即完成fire-and -orget

消费者consumer立即响应

事件与命令是有区别的

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

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

时间驱动:比如cron定时计划执行

请求驱动:客户端和服务器端之间,常见SOA

.事件驱动:以事件为特征。实时。

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

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

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

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

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

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

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

喜欢的朋友可以关注下专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。

对于现目前我这边也整理了适合1~5年程序员进阶的一些面试真题(含答案)还有些Java进阶必备知识架构资源以及一些阿里大牛精讲的视频资源,现免费分享给大家。希望对你们有点帮助。还有学习线路知识脑图。需要的都可以加入合作Q群Java进阶之路:908676731,免费获取。

java做eda开发_Java学习笔记——EDA事件驱动架构,你掌握了吗相关推荐

  1. java 检查bytebuf长度_Java学习笔记16-Netty缓冲区ByteBuf详解

    Java学习笔记16-Netty缓冲区ByteBuf详解 Netty自己的ByteBuf ByteBuf是为解决ByteBuffer的问题和满足网络应用程序开发人员的日常需求而设计的. JDK Byt ...

  2. java基本语法心得_Java学习笔记(一)——基础语法(上)

    Java学习笔记(一)--基础语法(上) 软件构造 写在前面 编写Java程序时,应注意以下几点:大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的 ...

  3. java多态怎么学_Java学习笔记---多态

    在面向对象的程序设计中,多态是继数据抽象和继承之后的第三种基本特性: 多态通过分离做什么(基类对象)和怎么做(导出类对象),从另一角度将接口和实现分离开来.多态不但能够改善代码的组织结构和可读性,还能 ...

  4. java 静态变量 存储_Java学习笔记9---类静态成员变量的存储位置及JVM的内存划分...

    笔记8提到了类静态成员变量的访问方式,但静态成员变量存储在哪里呢?在网上查阅不少资料,发现好多内容都是过时的了,其中主流观点是静态成员变量存放在方法区.JDK8之前,静态成员变量确实存放在方法区:但J ...

  5. java 脚本语言交互_Java学习笔记--脚本语言支持API

    Java语言的动态性之脚本语言支持API 随着Java平台的流行,很多的脚本语言(scripting language)都可以运行在Java虚拟机啊上,其中比较流行的有JavaScript.JRuby ...

  6. java swing 嵌入地图_Java学习笔记之SWING — 基本SWING程序(实现外部地图文件导入并显示) | 学步园...

    前言:不好意思啊,昨天去柯桥了趟,基本没怎么碰电脑, 不过脑子里还是想这点这个地图编辑器的问题的,开始一直在想怎么解决外部文件读入导致换行符的混入,后来发现BufferedReader类的readLi ...

  7. 浅析java中的死锁_Java学习笔记五十五(死锁问题)

    多线程死锁问题. 我们知道,多线程可以改善系统的资源利用率,并且可以提高程序的运行效率.但是,多线程也带来了新的问题,即:死锁问题. 1.死锁的概念 死锁可以理解为多个线程为了争夺同一个资源,而出现互 ...

  8. java string逆序_Java学习笔记(八)——异常

    本节主要内容是对 Java 的异常处理进行讲解,主要包含以下知识点: 异常分类 声明及抛出 捕获异常 自定义异常 * 异常堆栈 异常概述 对于程序的错误以及外部环境能够对用户造成的影响,我们应当及时报 ...

  9. java构造字符缓冲区_java学习笔记 | 学步园

    一.数组 类型[] 名称=new 类型[长度] 二.字符串2.1字符串类Stringjava.lang.StringString 名称=new String("xxxx")=&qu ...

  10. java 静态块的作用域_java 学习笔记(一)

    对象 new 出来的对象都是保存在堆内存中的 不是使用 new 创建变量,而是使用一个"自动"变量. 这个变量直接存储"值",并置于栈内存中,因此更加高效. 基 ...

最新文章

  1. P3321 [SDOI2015]序列统计(离散对数下NTT,乘法换加法)
  2. 深潜百米,采用半缆通信技术的Gladius水下无人机能够征服海洋吗?
  3. Vivado软件(用VerilogHDL)如何使用$readmemh和$readmemb函数
  4. 你每隔多久使用计算机上网查找资料英文,牛津英语8B Unit3导学案
  5. 智能集群理论优化控制_数学学科学术报告九:机器人集群的智能协同控制方法_中国计量大学...
  6. 数据结构与算法--2.数组的定位排序
  7. 求最大公约数问题(信息学奥赛一本通-T1207)
  8. 微信小程序云开发用户身份登录_你必须要掌握的微信小程序云开发
  9. pytorch构造IterableDataset,流式读取文件夹,文件夹下所有大数据文件,逐个文件!逐行读取!(pytorch Data学习四)
  10. OpenShift 4 - 多云管理(1) - 安装 RHACM、导入已有集群、配置观察功能
  11. python配置文件转dict
  12. [国嵌攻略][068][tftp网络协议实现]
  13. tp3.2 判断请求类型
  14. 车控APP发现安全隐患,研究人员模拟黑客入侵
  15. 在Linux中,用.swp文件恢复未保存的文件
  16. 尚学堂马士兵struts2 课堂笔记(三)
  17. java时间处理--判断当前时间是否在一个时间区间内
  18. 荣耀v40轻奢版和华为nova8的区别 哪个好
  19. win7喇叭红叉耳机扬声器已拔出驱动无法修复
  20. java 无法打印_自动打印在Java中不起作用

热门文章

  1. 「 软件安装 」嵌入式开发Keil5安装教程
  2. 【千律】OpenCV基础:图像边缘检测 -- Roberts 算子
  3. PIC16F887 单片机 proteus 红外遥控灯光控制系统
  4. 平面方程、夹角与点到平面的距离
  5. 魅族pro5 刷机 android,魅族Pro5刷通用固件方法教程[多图]
  6. Kinetics数据集下载
  7. siamfc代码解读_每日一文:目标跟踪(SiamFC)
  8. php 批量采集 邮箱,万能全网邮箱批量采集工具按照关键字搜索邮箱教程
  9. python直方图规定化_OpenCV python 彩色图像的直方图规定化
  10. matlab 矩阵规定化,Matlab实现直方图规定化