事件驱动

什么是事件驱动架构

事件驱动架构是一种松耦合、分布式的驱动架构,收集到某应用产生的事件后实时对事件采取必要的处理后路由至下游系统,无需等待系统响应。使用事件总线EventBridge可以构建各种简单或复杂的事件驱动架构,以标准化的CloudEvents 1.0协议连接云产品和应用、应用和应用等。
事件驱动架构体系结构具备以下三个能力:

事件收集:负责收集各种应用发生的事件,如新建订单,退换货订单等其他状态变更。
事件处理:对事件进行脱敏处理,并对事件进行初步的过滤和筛选。
事件路由:分析事件内容并将事件路由分发至下游产品。

优势

事件驱动架构具有以下优势:

降低耦合

降低事件生产者和订阅者的耦合性。事件生产者只需关注事件的发生,无需关注事件如何处理以及被分发给哪些订阅者。任何一个环节出现故障,不会影响其他业务正常运行。
异步执行

事件驱动架构适用于异步场景,即便是需求高峰期,收集各种来源的事件后保留在事件总线中,然后逐步分发传递事件,不会造成系统拥塞或资源过剩的情况。
可扩展性

事件驱动架构中路由和过滤能力支持划分服务,便于扩展和路由分发。
敏捷性

事件驱动架构支持与各种阿里云产品和应用集成,支持事件路由至任何系统服务,提供各种敏捷高效的部署方案。

事件驱动架构图

下图是人力资源服务系统的事件驱动架构示例,事件总线EventBridge收集人力资源服务系统产生的新员工入职事件,并对此事件进行路由和转发。这种体系结构可以提高站点的可扩展性,同时能更轻便的应对企业架构升级和系统拓展。

什么时候使用事件驱动架构

如果盲目使用事件驱动设计架构,就有可能要承担中断业务逻辑的风险,因为这些业务逻辑具有概念上的高度内聚,却采用了解耦机制将它们联系在一起。换句话说,就是将原本需要组织在一起的代码强行分离,并且这样难于定位处理流程,还有数据一致性保证等问题。为了防止我们的代码变成一堆复杂的逻辑,我们应当在某些明确场景下使用事件驱动架构。以经验来讲,以下三 种场景可以使用事件驱动开发:

  • 组件的解耦
  • 执行异步任务(可以拆解, 分多个小事务完成, 非强一致性)
  • 跟踪状态的变化 (事件溯源)Event Sourcing Pattern

使用事件驱动的优点

  • 高内聚,低耦合
  • 架构更健壮。如果加入队列的事件能够在源组件中执行,但在其它组件中由于 bug 导致其无法执行(由于将其加入到队列任务中,它们可以在 bug 修复后再执行)。
  • 业务处理减少延迟。当用户无需等待所有的逻辑都执行完成时,可以将这类工作加入到事件队列。
  • 便于系统扩展,能够让组件的研发团队独立开发,加快项目进度、降低功能难度、减少问题发生并且更有组织性。
  • 将信息封装在“事件”里,便于系统内传播。

在享受便利的同时,会带来一些缺点

  • 数据一致性问题。由于流程依赖于最终的一致性,因此通常不支持ACID事务,
  • 因此重复或乱序事件的处理会使服务代码更加复杂,并且难以测试和调试所有情况。
  • 缺点和优点相对应,正是因为它提供了很好的解耦能力,我们会比较难通过阅读代码去得到整个系统和流程的全貌。因为这些逻辑之间的关系不再是之前的依赖关系。这将会是一个挑战。
    如果处理器占用时间较长,那会阻塞应用程序的响应。

事件承载状态转移

我们在使用事件通知时,事件里面往往不会包含下游系统处理这个事件需要的所有信息。比如当内容发生下架变更时,内容平台会生成一个“内容下架“的事件,但当下游系统处理这个事件时,往往还需要知道,该内容上个状态是什么,是谁触发下架等信息,才能完成后续处理。所以不可避免地,下游系统在处理这个事件时,往往还需要通过平台服务来获取这些额外信息。

为了解决这个问题,我们引入一个种新的模式,叫做“事件承载状态转移”。简单来说,就是让事件的消费方自己保留一份在业务处理过程中需要用到的上游系统的数据。比如让下游系统保留一份在处理内容状态变更事件时所需要用到的内容变更前的状态,避免回头去平台查询。

优点

架构更健壮。减少事件消费方对生产方的额外依赖(获取事件处理所需数据);

业务处理减少延迟。增加事件消费方系统的响应速度,因为不再需要调用平台API以获取事件处理所需数据;

无需担心被查询组件的负载(尤其是远程组件)。

缺点

尽管现在数据存储已经不再是问题根源,依然会保存多个只读的数据副本,一致性进一步被破坏;

增加数据处理的复杂度,即使处理逻辑符合规范,它也需要额外处理和维护外部数据的本地副本业务逻辑。

五、总结

GUI框架
I/O框架

主流场景下,传统面向服务(或以数据驱动)的平台存在系统性不足,需要增强以下能力:

在传统数据集成基础上需要进一步提升业务集成能力。

需要提高集成平台的业务敏捷性和反应能力。

需要进一步实现业务系统间的解耦和高可靠性。

需要进一步提升管控平台的实时响应能力。

”事件驱动架构“天然地满足了这些能力要求。事件驱动架构”天生“的优点,比如,封装、高内聚和低耦合,还可以提升代码的可维护性、性能和业务增长的需求,通过事件溯源模式,还能提高系统数据的可靠性。

不过,事件驱动同样存在弊端,因为无论是概念上的复杂度还是技术上的复杂度都增加了,当它被滥用时将导致灾难性的后果

https://blog.csdn.net/vivo_tech/article/details/122661076?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-4-122661076-blog-118662876.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-4-122661076-blog-118662876.pc_relevant_aa&utm_relevant_index=5

下一篇可能会写一篇java中使用内存屏障实现的语义