喜欢的朋友可以关注下专栏: 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, 免费获取.
来源: http://www.jianshu.com/p/a274b2bfe135