基于事件驱动编程设计

「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

事件驱动这个词我们开发人员经常能够听到。那么事件驱动到底代表了什么呢?简单来说就是当一件事情发生,会触发另一件事情的发生,就比如说我们下单商品,支付后会扣款,会改变订单状态,会触发短信通知,会提高会员积分,会通知仓库发货等等。

1 概念

事件驱动架构(Event-driven architecture,EDA)是一种主流的异步分发事件架构模式,常用于设计高度可拓展的应用。事件驱动架构中事件可传输于松散耦合的组件和服务之间。一个事件驱动的系统一般是由事件消费者和事件产生者组成。事件消费者向事件管理器订阅事件,事件产生者向事件管理器发布事件。当事件管理器从事件产生者那接收到一个事件时,事件管理者把这个事件转送给相应的事件消费者。如果这个事件消费者是不可用的,事件管理者将保留这个事件,一段间隔之后再次转送该事件消费者。

其实简单的说,事件驱动架构就是让我们的程序处于被动,由事件触发程序的运行。

2 事件驱动的设计案例

事件驱动的GUI

做过桌面程序的同学感觉肯定尤为强烈,比如我们C#的WinForm程序,就是有一个一个的组件,加一个一个的事件进行设计的,比如窗体加载事件,鼠标单击、双击事件等,当每一种事件发生都会触发一段程序,去进行事件的处理,比如窗体加载事件发生就会触发查询,单击保存事件触发保存数据逻辑等等。如下边的QQ音乐也是如此,上边列表会触发不同类型的查询,展示不同的页面,点击播放会触发播放音乐的操作,这些都是事件驱动。Web前端与其极为类似,也是监听响应的事件,当事件产生进行相应的处理。

image.png

3 事件驱动 实现

3.1 观察者模式

  • 观察者向事件管理器注册
  • 事件管理器监听到消息后通知对应的观察者执行对应的方法

image.png

具体实现:

  • Spring Events

Spring框架的事件机制就是典型的观察者模式

3.2 发布/订阅模式

  • 事件源向抽象的事件管理器中发布消息
  • 抽象的事件管理器会将消息放入对应的topic
  • 订阅了对应topic的接受者接收处理消息

image.png

具体实现:

  • Guava EventBus事件总线image.png
  • 消息队列

消息队列也是基于发布订阅这种思想建立的

  1. 事件驱动的特点

优点:

  • 松耦合;
  • 支持异步;
  • 支持重用,容易并发处理;
  • 有良好的扩展性;

缺点:

  • 削弱对系统的控制能力;
  • 数据交换问题;
  • 系统复杂度上升,排查问题更复杂;

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%