06 - 3 事件驱动架构模式——EDA

news2024/11/16 2:58:15

何为EDA

  • 事件驱动架构是一种异步分发事件的架构模式
  • 用于高扩展且低耦合的系统
  • 以事件为核心,一系列解耦的、单一功能的事件处理器

Notification

  • 源系统发送消息通知其他系统状态改变
  • 接收方响应非必须
  • 发送 Event 逻辑与处理 Event 逻辑无依赖,独立变化
  • 解耦,各自扩展

Carried State Transfer

  • 源系统推送消息及变化
    • 依赖者生成信息副本
  • 容错(fault tolerance)
    • 源系统不可用时,依赖者可以使用副本
  • 依赖者维护信息副本和变化
    • 数据冗余
    • 数据一致性
  • 提高整体性能
    • 依赖者直接使用信息副本

经典应用 NIO

  • 针对不同的 IO Event 分配不同的 handler
  • Selector:监控那些Channel 有 IO Event
  • SelectionKey:维护 IO Event 的状态和绑定的 handler
    在这里插入图片描述

经典应用 Nginx

  • Nginx 的工作进程一直监听端口并等待 Event
  • Event 是由新建立的连接所触发
  • 所有的连接都会被分配到一个对应的状态及
  • Non-blocking
    在这里插入图片描述

EDA:两种Topology

在这里插入图片描述

Mediactor中介模式

  • 存在业务流程
  • 多步骤
  • 统一协调,居中调度
  • 事件分层次
    在这里插入图片描述

Event Queue

  • 源系统将 event 发送到 queue
  • event 处理系统从 queue 中消费 event
  • 源系统和事件处理系统的连接点
  • queue 只关心事件的传输

Event Mediactor

  • 中介从 queue 中消费原始事件,并分配、协调各个执行步骤
  • 对应业务处理的每个步骤,产生待处理事件(业务事件)
  • 将待处理事件异步分发到不同的通道(channel)
  • 无具体业务逻辑,只知道有哪些步骤

Event Channel

  • Mediator 向 channel 发送消息,processor从channel读取
  • 某种业务事件(消息)的聚合
  • 多个processor可以监听同一个channel

Event Processor

  • 监听channel的event
  • 具体的、单一功能的业务逻辑单元
  • 处理器之间无关联性
  • 所有处理器合作形成完整的业务流程

Mediactor模式应用场景

在这里插入图片描述

Broker代理模式

  • 无中心控制器
  • 轻量的消息代理将消息串联成链状
  • 分发至事件处理器组件
  • 事件处理器独立运作
    在这里插入图片描述

Broker

  • 轻量级的代理
  • 无业务逻辑的简单消息分发
  • 源系统将event发送至代理(通道)供processor消费
  • 事件通道可以是queue,topic或两者的组合

Event Processor

  • 监听channel的event,判断是否处理
  • 处理一个事件,发送一个事件,标明其行为
  • 事件处理器,单一业务逻辑
  • 处理器无关联性,不构成业务逻辑链

应用:订单状态日志记录

在这里插入图片描述

EDA模式优缺点

优点

  • 灵活性
    • 架构能在不断改变的使用场景下快速响应
    • 事件处理器组件目的单一、高度解耦,可以独立变化
    • 代理拓扑结构比中介拓扑结构调度更容易
  • 可扩展性
    • 高度解耦,独立变化

    • 横向扩展

      • 不同组件的运行结点数可自行调整
      • 组件本身可以自行决定是否再拆分实现
    • 纵向扩展

      • 计算密集型还是内存密集型,按需调整
  • 性能
    • 细粒度的事件处理器有利于提高性能
    • 整体架构是异步并行有利于提高性能
  • 易于部署:高度解耦的事件处理器组件让整体部署相对容易

缺点

  • 可测试性
    • 单元测试无差异
    • 集成测试难
      • 组件众多
      • 异步
  • 可维护性
    • 分布式部署
    • 异步:对程序员要求高一些
    • 异常处理难
    • 代码可读性
  • 性能:分布式消息(事件)传递会降低性能

真实案例分析

短信验证码

在这里插入图片描述

电商订单生命周期管理

在这里插入图片描述

数据同步消息广播

在这里插入图片描述

面试

电商系统下单成功,如果有风控问题,需要客服接入,如何设计

思考深度和实现层面:考虑未来可能出现的问题,留下可扩展的接口

  • 目前提出的是风控问题,后续还有可能有其他问题,包装成一个事件,广播出去,只要是需要处理这个事件的都可介入处理,保障系统的可扩展性和灵活性

淘汰老系统,如何实现双写

  • 把所有涉及到更新和添加的操作封装成一个事件,广播出去
  • 任何一个通过网络传输的东西都有丢失的风险,分布式系统下的一致性问题需要考虑,有可能发送源失效;也有可能发送成功但是没有收到广播;也有可能收到广播,但是还没有做操作,系统挂了。
  • 还需要考虑后续需要有一个类似于对账的系统,对比两个数据的一致性问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为路由WS5200 四核版使用体验

文章目录 前言一、主界面和上网设置二、网络WIFI设置三、安全和系统总结 前言 其实我是看不上这种除了能上网,没任何用的东东的。除了上古时代用过类似的简单设备,已经十数年没再看一眼这种东西了,当然更不会去买这种东西,别误会…

vscode配置latex

reference:https://zhuanlan.zhihu.com/p/166523064 1 texlive卸载 找到texlive\2019\tlpkg\installer下的uninst.bat文件并点击运行。 删除环境变量 2 texlive安装 打开https://tug.org/texlive/acquire-iso.html点击下载iso文件 3 vscode 安装 4 latex插件…

Linux系统编程 多线程基础

文章目录 前言一、线程概念二、线程的创建三、线程的退出四、pthread_join函数总结 前言 本篇文章作为多线程的入门讲解将带大家先创建几个线程来感受一下什么是多线程,了解一下多线程到底有什么作用。 一、线程概念 线程(Thread)是程序执…

C++类与对象(二)——构造函数与析构函数

文章目录 一.类的默认6个成员函数二.构造函数1.引例2.构造函数的概念及特性 三.析构函数😋析构函数的特性 前言: 上篇文章初步认识了类以及类的相关知识,本篇将继续深入学习类与对象——类的默认6个成员函数: 一.类的默认6个成员函…

制造企业如何跨越大规模定制鸿沟?中国最大减速机企业的答案来了

导读:传统制造企业如何深度用云? 在中国制造向中国智造的转型中,长三角地区一直扮演着急先锋的角色。总部位于常州的江苏国茂减速机股份有限公司(简称国茂股份),就是中国制造上云转型的典型代表。 国茂股份成立于1993年&#xff0…

Microelectronic学习章节总结(2)-- data path和control unit设计

文章目录 part1. Data path设计1.1 logic unit1.2 shifter1.3 adder1.4 comparator1.5 multiplier1.6 divider1.7 register file part2. Control unit设计part3. CPU SoC上的其它部件 (TODO:理解总结)3.1 总线AMBA(parallel) 3.2 Memorymemor…

[C++基础]-类和对象(下)

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、深入学…

推荐算法实战项目:AFM 原理以及案例实战(附完整 Python 代码)

本文要介绍的是由浙江大学联合新加坡国立大学提出的AFM模型。通过名字也可以看出,此模型又是基于FM模型的改进,其中A代表”Attention“,即AFM模型实际上是在FM模型中引入了注意力机制改进得来的。 之所以要在FM模型中引入注意力机制&#xf…

PC3-管理员操作

token无效可能,就是token过期了需要配置::: history 安装可以跳路由在ts文件中:因为在ts文件中还需要store,清空token // 安装可以跳路由在ts文件中npm i history 防止接口出现 token 无效,登…

【C++】AVL平衡二叉树源码剖析

目录 概述 算法 左单旋 右单旋 左右双旋 右左双旋 源码 AVLTree.h test.cpp 概述 AVL树也叫平衡二叉搜索树,是二叉搜索树的进化版,设计是原理是弥补二叉搜索树的缺陷:当插入的数据接近于有序数列时,二叉搜索树的性能严重…

20天能拿下PMP吗?

新版大纲,专注于人员、过程、业务环境三个领域,内容贯穿价值交付范围(包括预测、敏捷和混合的方法)。除了考试时间由240分钟变更为230分钟、200道单选题变为180道(包含单选和多选)之外,新考纲还…

【Ubuntu18配置Anaconda深度学习环境】

参考:Ubuntu18配置与ROS 兼容的深度学习环境(Anaconda3PyTorch1.10python3.8cuda10.2) 1. 前言 之前在Window下安装了Anaconda,熟悉了一下安装过程,Ubuntu18.04下最难的应该就是和ROS Melodic的兼容问题。ROS1是基于P…

Linux常用命令——inotifywait命令

在线Linux命令查询工具 inotifywait 异步文件系统监控机制 补充说明 Inotify一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可…

数据结构之第十一章、排序算法

一、排序的概念及引用 1.1排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 1.1.1排序的稳定性 稳定性:假定在待排序的记录序列中,存在多个具…

数据结构之第九章、优先级队列(堆)

目录 一、优先级队列 1.1概念 二、优先级队列的模拟实现 2.1堆的概念 2.2堆的存储方式 2.3堆的创建 2.3.1堆向下调整 2.3.2堆的创建 2.3.3建堆的时间复杂度 2.4堆的插入与删除 2.4.1堆的插入 2.4.2堆的删除 2.5用堆模拟实现优先级队列 三、常用接口介绍 3.1Priori…

计算机组成原理与体系结构

目录 第一章、计算机组成原理与体系结构1、数据的表示1.1.进制转换1.2.原码、反码、补码、移码1.3.数据的表述 2、计算机结构3、Flynn分类法4、CISC与RISC5、流水线技术5.1、流水线的基本概念5.2、流水线的计算5.3、流水线吞吐率计算5.4、流水线加速比计算5.5、流水线的效率 6、…

Python小姿势 - Python的多线程编程

Python的多线程编程 Python的多线程编程提供了一个非常简单的方法来让一个Python程序同时运行多个任务。这个方法通过创建新的线程来实现,线程可以被视为一个单独的执行流程。 为了创建一个新线程,我们需要使用Python的_thread模块中的start_new_thread(…

【IDEA】简单入门:请求数据库表数据

目录 修改编辑与控制台字体大小 二、sprintboot项目入门 【1】直接开始配置Controller 【2】直接请求数据库中的数据,返回json格式 (0)整合PostgreSQL框架 (2)实体entity类 (3)控制类Mai…

快速了解车联网V2X通信

自动驾驶拥有极其巨大的潜力,有可能改变我们的出行方式。它不仅有望永远改变车辆的设计和制造,还会永远改变汽车的所有权乃至整个交通运输业务。要实现全自动驾驶的目标,开发人员需要开发极为复杂的软件,软件中融入的人工智能(AI)…

机械硬盘和固态硬盘有什么区别?如何使用?

案例:怎么区分机械硬盘和固态硬盘? 【我知道硬盘可以用来储存数据,但我不知道机械硬盘和固态硬盘的区别,有没有小伙伴可以详细解释一下。】 硬盘可以用来储存数据,常见的硬盘有两种,分别是机器硬盘和固态…