「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」
事件驱动这个词我们开发人员经常能够听到。那么事件驱动到底代表了什么呢?简单来说就是当一件事情发生,会触发另一件事情的发生,就比如说我们下单商品,支付后会扣款,会改变订单状态,会触发短信通知,会提高会员积分,会通知仓库发货等等。
1 概念
事件驱动架构(Event-driven architecture,EDA)是一种主流的异步分发事件架构模式,常用于设计高度可拓展的应用。事件驱动架构中事件可传输于松散耦合的组件和服务之间。一个事件驱动的系统一般是由事件消费者和事件产生者组成。事件消费者向事件管理器订阅事件,事件产生者向事件管理器发布事件。当事件管理器从事件产生者那接收到一个事件时,事件管理者把这个事件转送给相应的事件消费者。如果这个事件消费者是不可用的,事件管理者将保留这个事件,一段间隔之后再次转送该事件消费者。
其实简单的说,事件驱动架构就是让我们的程序处于被动,由事件触发程序的运行。
2 事件驱动的设计案例
事件驱动的GUI
做过桌面程序的同学感觉肯定尤为强烈,比如我们C#的WinForm程序,就是有一个一个的组件,加一个一个的事件进行设计的,比如窗体加载事件,鼠标单击、双击事件等,当每一种事件发生都会触发一段程序,去进行事件的处理,比如窗体加载事件发生就会触发查询,单击保存事件触发保存数据逻辑等等。如下边的QQ音乐也是如此,上边列表会触发不同类型的查询,展示不同的页面,点击播放会触发播放音乐的操作,这些都是事件驱动。Web前端与其极为类似,也是监听响应的事件,当事件产生进行相应的处理。
3 事件驱动 实现
3.1 观察者模式
- 观察者向事件管理器注册
- 事件管理器监听到消息后通知对应的观察者执行对应的方法
具体实现:
- Spring Events
Spring框架的事件机制就是典型的观察者模式
3.2 发布/订阅模式
- 事件源向抽象的事件管理器中发布消息
- 抽象的事件管理器会将消息放入对应的topic
- 订阅了对应topic的接受者接收处理消息
具体实现:
- Guava EventBus事件总线
- 消息队列
消息队列也是基于发布订阅这种思想建立的
- 事件驱动的特点
优点:
- 松耦合;
- 支持异步;
- 支持重用,容易并发处理;
- 有良好的扩展性;
缺点:
- 削弱对系统的控制能力;
- 数据交换问题;
- 系统复杂度上升,排查问题更复杂;
本文转载自: 掘金