1、事件驱动架构
事件驱动模型,观察者模式,或者称为基于发布-订阅模式的编程模式。
事件驱动架构模型如下:
包含:
事件生产者
:产生一连串的事件,也叫事件源
;如界面上的按钮是一个事件源,能够产生点击事件;事件消费者
:监听并且消费事件,也叫事件监听器
;事件
:或者成为事件对象,是事件源和事件监听器之间的信息桥梁,整个事件模型驱动的核心;
事件近乎实时的投递,因此消费者能够立刻对事件作出响应。生产者和消费者互相解耦,不同的消费者也是相互解耦的,每个消费者都监听所有与之关联的事件(广播消费),这与消费者竞争模式(集群消费)不太一样:
这种模式消费者从一个消息队列中拉取消息,并且一个消息只会被其中一个消费者消费一次。
1.1、事件驱动架构实现方式
Pub/sub模型
消息组件记录所有的订阅者,当时一个事件发布的时候,消息组件把事件发送给每个订阅者。当一个事件接收之后,后续新加进来的订阅者不能消费之前的事件;
事件流模型
事件被写到了一个日志中。此时事件按照顺序持久化。客户端可以读取这个事件流的任何一部分,一般情况下是检索定位到事件流的具体位置,来进行消息消费,这意味着客户端可以在任何事件加入进来,并且能够重做事件。
1.2、消费端的一些变种
简单事件处理
一个事件立刻触发消费者的行为。
复杂事件处理
消费者处理一系列列的事件时,通过如Azure Stream Analytics或者Apache Storm等技术在事件数据中查找特定的模式。
是一种基于动态环境中事件流的分析技术,事件在这里通常是有意义的状态变化,通过分析事件间的关系,利用过滤、关联、聚合等技术,根据事件间的时序关系和聚合关系制定检测规则,持续地从事件流中查询出符合要求的事件序列,最终分析得到更复杂的复合事件,主要用于网络诈欺识别等防止犯罪,银行等金融行业防止,以及风险规避和营销决策等。see 复杂事件处理
事件流处理
使用一个类似Azure IoT Hub或者Apache Kafka的数据流平台作为一个管道,接收事件并且让流处理器进行处理,流处理器主要负责处理或者转换流。应用中不同的子系统有各种各样的流处理器。这种模式能够很好的适配IoT工作量。
1.3、使用场景
- 多个子系统需要处理相同的事件;
- 实时处理,保证最小的延迟;
- 复杂事件处理,如在一个时间窗口内进行聚合或者模式匹配;
- 高吞吐量和告诉传输的数据,如IoT。
1.4、优点
- 生产者与消费者解耦;
- 非点对点的对接模式,这很容易在系统中添加新的消费者;
- 消费者能够在接收到事件之后快速响应;
- 高可扩展性,分布式支持;
- 子系统各自的事件源视图;
1.5、挑战
- 消息不丢失,保证投递;
- 消息的有序性以及确保消费一次。
2、观察者模型
观察者模式即是pub/sub模型,简单事件处理。
详细介绍:设计模式笔记 - Observer 观察者模式 (Design Pattern)
Watcher
观察者,也叫消费者;notifyWatchers()
方法的参数即是事件(消息);Subject
主题角色,即是广播事件发布器。
3、JDK中的观察者模式
如上图,JDK观察者模式关键的是Observable
类,被观察者,也叫事件源,事件生产者;Observer
是观察者,也叫事件消费者。
详细介绍:Java基础笔记 - JDK中提供的观察者模式支持