0%

事件驱动模型与观察者模型

1、事件驱动架构

事件驱动模型,观察者模式,或者称为基于发布-订阅模式的编程模式。

事件驱动架构模型如下:

image-20191110162451728

包含:

  • 事件生产者:产生一连串的事件,也叫事件源;如界面上的按钮是一个事件源,能够产生点击事件;
  • 事件消费者:监听并且消费事件,也叫事件监听器
  • 事件:或者成为事件对象,是事件源和事件监听器之间的信息桥梁,整个事件模型驱动的核心;

事件近乎实时的投递,因此消费者能够立刻对事件作出响应。生产者和消费者互相解耦,不同的消费者也是相互解耦的,每个消费者都监听所有与之关联的事件(广播消费),这与消费者竞争模式(集群消费)不太一样:

image-20191110164021501

这种模式消费者从一个消息队列中拉取消息,并且一个消息只会被其中一个消费者消费一次。

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中的观察者模式

image-20191110223224036

如上图,JDK观察者模式关键的是Observable类,被观察者,也叫事件源,事件生产者;Observer是观察者,也叫事件消费者。

详细介绍:Java基础笔记 - JDK中提供的观察者模式支持

4、Spring事件驱动

Spring事件驱动模型

References

事件驱动模型与异步

Event-driven architecture style

Competing Consumers pattern

复杂事件处理

流处理时代

欢迎关注我的其它发布渠道