事件驱动

生活中的事件驱动:

  • 银行存款事件,触发更新余额、用户星级提升、贷款广告推送

  • 航班延误事件,触发广播通知客户、后续形成更新、酒店订单更新

事件驱动架构

事件驱动架构(Event-driven architecture,简称EDA),是指软件系统中发生了某些事件,导致软件的其他部分的操作或者执行。是一种软件设计的方法。

其中,事件是软件系统中某种显著的变化。

主要应用场景:

  • GUI,点击按钮发生点击事件,触发操作

  • 调试器,当程序运行系统当运行到了某个点时,发送事件,触发断点调试。这种关系称为反转控制关系,即主观上时调试器控制运行系统调试,客观上是运行系统通知调试器,推送了断点调试。

整个流程:

picture 1
  1. 事件生产方(Event Producer)发生事件(Event happends),并通过事件发射器(Event Emitter)向事件通道(Event Channel)发送这个事件

  2. 事件管理器(Event Manager)接收到通道中的事件,对事件进行管理或者进行事件传播(Event disseminates)

  3. 事件将会由事件接收者(Event Sinks)接收,并交给他所属的事件消费者(Event Consumer)进行事件评估并采取相关的动作(Event's evaluated and action are token)

类比过程,以mq为例:

  1. 按钮发生点击事件,通过mq客户端向mq发送消息

  2. mq服务端接收到消息,根据topic向消费者发送消息

  3. 消费者的mq接收端接收到消息,将会使用程序消费消息,并作出响应的操作

观察者模式

图 1

被观察者(Subject)持有观察者(Observer)的引用,当被观察者发生变化时,将会自动调用观察观察者对象的通知方法。

观察者模式中,Subject既充当事件生产方,又充当事件管理器。

AWT

awt就是观察者模式的典型运用场景:

上述代码中,组件类型JPanelSubjectActionListenerObserver,类型FooPanel即使观察者又是被观察者。

被观察者通过btn.addActionListener(this);代码将观察者的引用加入到内部中。

JDK Observer

Spring Event

Spring Event位于Spring的核心模块中,他主要通过核心类ApplicationEvent以及ApplicationListener接口提供功能。实现ApplicationListener并将其放入到IoC容器中,当有ApplicationEvent事件publish到ApplicationContext中时,就可以监听指定的事件并做出相应的操作。Spring Event基于典型的观察者模式实现。

集成ApplicationEvent可以实现自己的事件,在Spring内部提供了一套标准的内置事件:

  1. ContextRefreshedEvent

  2. ContextStartedEvent

  3. ContextStoppedEvent

  4. ContextClosedEvent

  5. RequestHandledEvent

  6. ServletRequestHandledEvent

示例代码:

发布订阅模式

将事件处理器单独的抽取出来,而不是像观察者模式一样合在一起,就是发布订阅模式。由事件管理器管理生产者与消费者,并控制事件的传输。

picture 4
  1. 向事件管理器注册消息发布者与消费者

  2. 事件管理器将事件分为多个Topic

Google Guava Event Bus

picture 5
  1. Publisher为事件生产方

  2. Event Bus为事件管理器

  3. Subscriber为事件消费方

使用Event Bus:

  1. 定义事件对象

  2. 定义事件监听器

  3. 使用事件监听器

Spring AMQP

如何在观察者和发布订阅中选择

观察者模式和发布-订阅模式都是用于解耦发布者和订阅者之间的通信,但它们在一些方面有所不同。下面是它们的基本概念和适用场景:

观察者模式:

观察者模式基于一个主题(通常称为主题或可观察对象),它维护一组观察者对象并在状态发生变化时通知它们。主题和观察者之间是一对多的关系,一个主题可以有多个观察者。当主题的状态发生变化时,所有观察者都会收到通知并进行相应的更新。

适用场景:

  • 当主题状态的变化需要通知多个观察者,并且观察者的数量和身份可能会动态变化时,可以使用观察者模式。

  • 当观察者需要订阅和取消订阅主题的通知时,观察者模式是一个很好的选择。

  • 当希望在主题和观察者之间建立松散耦合关系,以便能够方便地添加、移除和修改观察者时,可以使用观察者模式。

发布-订阅模式:

发布-订阅模式是一种通过使用消息代理(称为发布者)来解耦发送者和接收者之间的通信。发布者将消息发送到一个或多个主题,而订阅者可以选择订阅感兴趣的主题并接收相应的消息。发布者和订阅者之间是一对多的关系。

适用场景:

  • 当需要在不同组件或模块之间进行松散耦合的通信时,发布-订阅模式是一个不错的选择。

  • 当发布者和订阅者之间的关系是动态的,并且它们可能随时加入或离开系统时,发布-订阅模式非常适用。

  • 当希望扩展和修改通信机制,例如引入消息代理或中间件来处理消息时,发布-订阅模式是一个强大的工具。

总结:

观察者模式适用于一对多的关系,主题和观察者之间的通信比较直接。而发布-订阅模式适用于发布者和订阅者之间的松散耦合通信,通过消息代理来进行中介。

最后更新于

这有帮助吗?