EDA事件驱动架构

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



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

事件驱动有以下特征:



生产者producer发生实时事件
推送通知
生产者发射即完成fire-and -orget
消费者consumer立即响应
事件与命令是有区别的
  借助消息系统异步模型的特点,事件驱动也有异步特征,传统方法调用比如调用b.xxmethod()是一种同步模型,这时必须等待b的方法执行完才能继续执行其他代码,RPC远程方法调用也是一种同步模型,而对于异步模型来说,事件生产者发出事件后,不必等待回应,可以继续执行下面的代码。



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



时间驱动:比如cron定时计划执行
请求驱动:客户端和服务器端之间,常见SOA
.事件驱动:以事件为特征。实时。
  请求驱动+消息系统和事件驱动+消息系统有本质区别,前者是由请求者作为消息生产者,主要目的是为了得到响应,因此是一种请求响应模型;而后者重点是在消息消费者,不是在消息生产者,业务逻辑站在消费者角度完成,业务逻辑的完成靠事件驱动来执行,而前者业务逻辑是在消息生产者完成,当业务逻辑中需要什么依赖或资源,依靠发送消息来拉取完成。这两种区别本质是拉Poll和推Push的区别。



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



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



  EDA的可扩展性和吞吐量上要强于传统SOA,EDA类似组装生产线,下图对于一个顺序线性的处理过程,6个步骤分别是接受 确认 保存 产生PDF 发送Email 输出展现,花去365ms
  
  而组装线的EDA方式,总是询问着6步中是否可以让别人协同帮助完成?其中第4步和第5步是可以的,因此整个处理时间提升到115ms,提升了70%的响应时间:



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



  最终我们可以完成一个新的基于领域事件的D-EDA+SOA架构如下
https://www.jdon.com/eda.html



https://www.jdon.com/reactive.html
https://www.jdon.com/functional.html
https://www.jdon.com/aop.html
https://www.jdon.com/eda.html



1.定义
  探索性数据分析(Exploratory Data Analysis,简称EDA),是指对已有的数据(特别是调查或观察得来的原始数据)在尽量少的先验假定下进行探索,通过作图、制表、方程拟合、计算特征量等手段探索数据结构和规律并且分析数据以概括其主要特征的一种数据分析方法。



  探索性数据分析在上世纪六十年代由John Tukey提出,它鼓励统计学家研究数据,并尽可能提出假设,尽可能生成新的数据收集和实验。与传统统计分析方法的区别在于:传统的统计分析方法以概率论为基础,先假定数据服从某种分布,然后依据数据样本来估计模型的一些参数及统计量,以此了解数据的特征。但实际中往往有很多数据并不符合假设的统计模型分布,这导致数据分析结果不理想。EDA则是一种更加贴合实际情况的分析方法,它“抛开”概率理论,从数据出发,强调数据可视,让数据自身“说话”,有助于我们了解数据在形式化建模或假设测试任务之外的其他价值。



  大数据时代,EDA可以很好地应用于处理各种杂乱的“脏数据”。通过EDA我们可以最真实、直接的观察到数据的结构及特征。EDA出现之后,数据分析的过程就分为两步了,探索阶段和验证阶段。探索阶段侧重于发现数据中包含的模式或模型,验证阶段侧重于评估所发现的模式或模型,很多机器学习算法(分为训练和测试两步)都是遵循这种思想。当我们拿到一份数据时,如果做数据分析的目的不是非常明确、有针对性时,可能会感到有些茫然,那此刻就更加有必要进行EDA了,它能帮助我们先初步了解数据的结构及特征,甚至发现一些模式或模型,再结合行业背景知识,也许就能直接得到一些有用的结论。



2.步骤
  通过以上EDA的定义,我们可以大致整理一下思路:



  1、拿到数据后,先写出一系列自己做的假设,然后接着做更深入的数据分析。



  2、结合可视化,记录下探索过程。



  3、把中间结果给同行看看,获取一些更有拓展性的反馈或者意见。不要独自一个人做,国外的思维就是知道了什么就喜欢open to everybody。走出去,多多交流,open to the world。



  4、将可视化与结果结合一起。探索性数据分析,逐渐培养自己的数据意识和模型意识。一旦结果违背最初的假设,就要立即回去进行详细的思考。所以我们在数据探索的尽可能把自己的可视化图和结果放一起,这样便于进一步分析。



3.过程



3.1单变量分析
基本统计量(中位数、四分位数、偏度、峰度等等)



频率和众数



百分位数



位置度量:均值和中位数



散步分量:极差和方差



偏度、峰度:数据的大致分布情况,功能上与直方图类似,其虽然可量化,但不如直方图直观



直方图



对称
分散
异常值
有间隙
箱线图



异常值
对称
比较几批数据的形状
正态性检验



图示法:
直方图钟型
箱线图
QQ图
非参数检验方法
3.2多变量分析
线性相关? 秩相关? 关联性如何?
注意:先绘制散点图,要求两变量来自正态总体,出现异常值慎用
3.3可视化
在进行了单变量与多变量的分析之后,应该得到一个展示成果性的报表。制作报表时应该思考以下的信息:



数据缺失?



有异常值?



特征有冗余?



分布情况?



样本是否重复?



样本是否平衡? 尤其是在进行机器学习训练分类器的时候,不同类别的样本数量应该大致相同,如果不相同,可采用上采样或者下采样的方法(后文会讲到)



是否需要抽样?



是否需要降维?



能否构造更有价值的特征?



连续特征是否需要离散化?



是否需要对变量进行重新计算?



可视化技术



将数据映射到图形元素
组织数据进行映射
解决数据维度问题
4.案例
具体案例可参考 Blink 的文章,https://www.jianshu.com/p/9325c9f88ee6,



Category web