0%
这是一片思考的空间 -- arthinking
Spring 重构&代码整洁之道 软件设计 JVM 并发编程 数据结构与算法 分布式 存储 网络 微服务 设计模式
Java技术栈 - 涉及Java技术体系

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

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

复杂事件处理

流处理时代

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

订阅IT宅
内功修炼
Java技术栈
Java架构杂谈是IT宅精品文章公众号,欢迎订阅:
📄 网络基础知识:两万字长文50+张趣图带你领悟网络编程的内功心法 📄 HTTP发展史:三万长文50+趣图带你领悟web编程的内功心法 📄 HTTP/1.1:可扩展,可靠性,请求应答,无状态,明文传输 📄 HTTP/1.1报文详解:Method,URI,URL,消息头,消息体,状态行 📄 HTTP常用请求头大揭秘 📄 HTTPS:网络安全攻坚战 📄 HTTP/2:网络安全传输的快车道 📄 HTTP/3:让传输效率再一次起飞 📄 高性能网络编程:图解Socket核心内幕以及五大IO模型 📄 高性能网络编程:三分钟短文快速了解信号驱动式IO 📄 高性能网络编程:彻底弄懂IO复用 - IO处理杀手锏,带您深入了解select,poll,epoll 📄 高性能网络编程:异步IO:新时代的IO处理利器 📄 高性能网络编程:网络编程范式 - 高性能服务器就这么回事 📄 高性能网络编程:性能追击 - 万字长文30+图揭秘8大主流服务器程序线程模型
📄 Java内存模型:如果有人给你撕逼Java内存模型,就把这些问题甩给他 📄 一文带你彻底理解同步和锁的本质(干货) 📄 AQS与并发包中锁的通用实现 📄 ReentrantLock介绍与使用 📄 ReentrantReadWriteLock介绍与使用 📄 ReentrantLock的Condition原理解析 📄 如何优雅的中断线程 📄 如何优雅的挂起线程 📄 图解几个好玩的并发辅助工具类 📄 图解BlockingQueue阻塞队列
📄 消息队列那么多,为什么建议深入了解下RabbitMQ? 📄 高并发异步解耦利器:RocketMQ究竟强在哪里? 📄 Kafka必知必会18问:30+图带您看透Kafka
📄 洞悉MySQL底层架构:游走在缓冲与磁盘之间 📄 SQL运行内幕:从执行原理看调优的本质 📄 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法