为什么事件驱动架构可以提高扩展性?

636 阅读3分钟

本文已参与掘金创作者训练营第三期「话题写作」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力

事件驱动架构是一种常见的软件架构设计方法,对事件驱动系统而言,事件的产生、通信、捕获、处理和持久保留是解决方案的核心结构。事件驱动架构不受具体编程语言的限制,可以最大程度的降低耦合度,因此在现在分布式架构中应用广泛。

案例

比如电商中的订单系统关于订单的状态变化,新建,支付,发货,取件等,如果由订单系统去调用其他系统,会给订单系统带来非常高的成本,理想的方式是所有的订单状态变化都发送一个消息,感兴趣的业务下游消费此消息进行业务逻辑处理。

如下图,理论上订单系统只需要写一份消息,如果有新的业务需要使用订单消息进行消费即可,可以写一份新的代码而不用修改任何老代码。

image-20210818075603177

常见事件驱动架构模型

发布/订阅模型

这是一种基于事件流订阅的消息传递基础架构。对于该模型而言,在事件发生或公布之后,系统会将相应的消息发送给需要通知的订阅用户。

事件流模型

借助事件流模型,事件将被写入日志,事件使用者无需订阅事件流。相反,它们可以从流的任何部分读取并随时加入流。

事件流有几种不同的类型:

  • 事件流处理使用诸如 Apache Kafka 等数据流平台来提取事件并处理或转换事件流。事件流处理可用于检测事件流中有用的模式。
  • 简单事件处理是指事件立即在事件使用者中触发操作。
  • 复杂事件处理则需要事件使用者处理一系列事件以检测模式。

事件驱动模型的优势

  • 异步:内部的组件不需要知道之前发生了什么,接下来发生什么,只需要关注处理各自的事件即可。
  • 松耦合,服务不需要(也不应该)知道或依赖于其他服务。
  • 易扩展:
    • 扩展现有服务:由于服务在事件驱动的体系结构下解耦,而且服务通常只执行一项任务,因此跟踪特定服务的进行扩展变得很容易。
    • 扩展新服务:只需要新增一个消费者即可,可随时自由的添加
  • 恢复支持:带有队列的事件驱动架构可以通过“重播”过去的事件来恢复丢失的工作。当用户需要恢复时,这对于防止数据丢失非常有用。

考虑事件模型一些注意事项

  • 事件太多:消息量过大的话,可能一些小服务无法消费完,从而堆积甚至被消息打挂掉。
  • 通用事件:过于通用的东西一般相当于没有这个东西,最好还是定义事件的规范,不同的事件要进行区分。
  • 业务量级:当应用体量还比较小的时候,可以考虑传统的模式即可,如果直接引入事件驱动架构会增加复杂度,增加成本。

为什么可以提高扩展性?

当扩展现有服务的时候,由于各自模块是解耦的,彼此不直接感知,因此对现有的服务直接进行扩容很简单。

当增加新的服务的时候,无需考虑其他服务和系统,只需要关注新服务逻辑以及事件本身即可,没有依赖,因此可以直接使用。