可扩展性设计架构模式——事件驱动架构

        事件驱动架构(Event-Driven Architecture, EDA)是一种可扩展性设计软件架构模式,它通过事件来触发和通信(以事件为核心),实现不同系统组件之间的解耦(促进应用程序或系统部件之间的松耦合通信)。这种模式特别适合于响应实时信息变化、高度分布式系统、以及需要大规模异步数据处理的应用。在这种架构中,事件是任何显著的事情或状态变化,这些事件通过消息系统进行传播,从而驱动整个系统的流程。

基本概念

事件(Event):事件是系统中发生的一个具体的事情,它可以是用户的操作(如点击)、系统的更新(如数据更新),或外部系统的输入(如传感器数据)。事件包含足够的信息来描述发生了什么,不包含具体的指令如何做。

事件生产者(Event Producer):事件生产者是创建并发布事件到事件处理系统的组件。例如,一个温度传感器可以是温度读数的事件生产者。

事件消费者(Event Consumer):事件消费者是订阅并响应事件的组件。它从事件通道接收事件,然后根据事件内容执行特定的处理逻辑。

事件通道(Event Channel):事件通道是事件从生产者传递到消费者的中介,它负责传输事件。这可以是消息队列、日志、服务总线等。

事件处理器(Event Handler):事件处理器是在事件消费者中处理接收到的事件的逻辑部分。

架构优势

  • 解耦:组件之间只通过事件进行通信,不直接调用对方的服务,从而实现松耦合。在EDA中,事件生产者和消费者之间不需要直接知晓对方,它们仅通过事件来交互。这种解耦合提高了系统的灵活性和可维护性。
  • 可扩展性:通过增加事件处理器和事件通道,可以轻松地扩展系统功能和处理能力。由于组件之间不直接交互,扩展系统功能(如添加新的事件处理器或事件来源)不会影响现有的业务逻辑。
  • 灵活性:可以在不影响其他组件的情况下修改、添加或移除事件的处理逻辑。
  • 响应性:事件驱动的本质使系统可以即时响应状态变化,适合需要快速反应的应用。

实现机制

事件驱动架构的实现通常依赖于以下技术:

  • 消息队列(如 Kafka, RabbitMQ):作为事件通道来异步传输消息。
  • 事件存储(如 Event Store):持久化事件数据。
  • Webhooks:用于实时数据传输。
  • 服务总线(如 Azure Service Bus):集成复杂的消息传输需求。

应用场景

  • 实时数据处理:实时分析用户行为或传感器数据,如金融交易系统、物联网设备管理。
  • 微服务架构:各微服务组件通过事件来交互,而非直接调用对方的API。
  • 异步任务处理:如电子商务中的订单处理,订单创建后可以触发多个后续处理事件。
  • 复杂事件处理:监控系统、预警系统。

详细推导原理和原因

        在事件驱动架构中,核心原理是发布-订阅模式。事件生产者不需要知道谁接收事件,只负责发布事件到一个共享的事件通道中。事件消费者订阅这些事件并根据事件类型或内容作出反应。这种模式的核心优势在于:

  • 隔离性:生产者和消费者的隔离降低了系统组件之间的依赖性,提高了系统的稳定性和可靠性。
  • 动态性:可以动态地添加或删除事件消费者而不影响生产者,使系统易于扩展和修改。

通俗解释和理解

可以将事件驱动架构比作一个现代化的邮局系统:

  • 事件生产者就像是寄信人,他们将不同的信件(事件)投递到邮局(事件通道)。
  • 事件通道是邮局系统,负责将信件分类并发送到正确的地址。
  • 事件消费者则像是收信人,他们只接收自己感兴趣的信件,并根据信件内容采取行动。

        这样的系统设计允许寄信人和收信人之间互不干涉,他们通过邮局这个中介机构来互相通信,从而维持了彼此的独立性和系统的整体效率。

实现流程

第一步:定义事件,明确哪些业务动作或状态变化应该触发事件

  • 原理:在事件驱动架构中,一个事件代表了一个明确的状态变化或业务行为。定义事件是确定哪些动作或变化应当被系统捕捉并触发后续流程的关键步骤。
  • 操作步骤
    1. 识别事件源:分析业务流程,找出需要触发通知的行为,例如订单的创建、支付和发货。
    2. 定义事件结构:为每个事件定义必要的信息结构,如订单号、客户ID、商品详情等。

第二步:设计事件模型,构建事件的数据结构和类型,确保它们能够准确反映业务的需求

  • 原理:事件模型定义了事件的数据格式和类型,它确保事件的信息被标准化和统一,便于不同的系统组件理解和处理。
  • 操作步骤
    1. 选择数据格式:通常使用 JSON 格式,因为它易于人类阅读和机器解析。
    2. 定义数据内容:详细指定每种事件包含的字段和数据类型。

第三步: 选择合适的消息队列或服务总线来传输事件,实现消息传递系统,如 Kafka 或 RabbitMQ。

  • 原理:消息传递系统负责在事件生产者和消费者之间安全可靠地传递事件消息。这个系统像是邮局,保证信件能准确送达。
  • 操作步骤
    1. 选择消息中间件:常用的有 Kafka、RabbitMQ等。这些工具支持高并发、数据持久化,并能保证消息不会因系统故障而丢失。
    2. 安装和配置:按照中间件的官方文档进行安装和基本配置。

第四步:编写事件生产者和消费者,生产者负责发布事件,消费者订阅并响应这些事件。

  • 原理:生产者负责生成和发送事件,消费者负责接收事件并根据事件内容执行相应操作。
  • 操作步骤
    1. 生产者实现
      • 监听关键业务行为。
      • 当这些行为发生时,生成并发送事件到消息系统。
    2. 消费者实现
      • 订阅感兴趣的事件。
      • 接收事件并处理,如更新数据库、发送邮件通知等。

第五步:部署和测试

  • 原理:部署到生产环境前需要充分的测试来确保系统的稳定性和性能。
  • 操作步骤
    1. 本地测试:在开发环境中模拟生产环境进行详细测试。
    2. 部署:将应用部署到生产服务器。
    3. 监控和优化:监控系统性能和稳定性,根据实际运行情况进行调整。

示例:基于事件驱动架构的简单电商系统

环境准备

开发环境:

  • Java JDK 11 或更高版本
  • Maven 或 Gradle(作为构建工具)
  • IntelliJ IDEA 或 Eclipse(作为开发环境)
  • RabbitMQ 服务器(用作消息中间件)

步骤 1:创建 Spring Boot 项目

使用 Spring Initializr (https://start.spring.io/)快速创建一个新的 Spring Boot 项目:

  • 选择 Maven 作为构建工具,Java 作为语言。
  • 添加依赖:Spring Web, Spring for RabbitMQ。

步骤 2:配置 RabbitMQ

在 application.properties 或 application.yml 文件中添加 RabbitMQ 的配置:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

步骤 3:创建事件模型

在项目中定义事件的数据模型。例如,创建一个订单事件类:

package com.example.demo.events;public class OrderEvent {private String orderId;private String status;// 构造器public OrderEvent(String orderId, String status) {this.orderId = orderId;this.status = status;}// getter 和 setterpublic String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId = orderId;}public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}
}

步骤 4:创建事件生产者

定义一个服务来发布事件:

package com.example.demo.services;import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.demo.events.OrderEvent;@Service
public class OrderService {@Autowiredprivate RabbitTemplate rabbitTemplate;public void createOrder(String orderId) {OrderEvent event = new OrderEvent(orderId, "创建");rabbitTemplate.convertAndSend("订单队列", event);System.out.println("发送的订单事件: " + event.getOrderId());}
}

步骤 5:创建事件消费者

定义一个组件来消费事件:

package com.example.demo.listeners;import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import com.example.demo.events.OrderEvent;@Component
public class OrderEventListener {@RabbitListener(queues = "orderQueue")public void onOrderEvent(OrderEvent event) {System.out.println("收到的订单事件:" + event.getOrderId() + " 状态为:" + event.getStatus());}
}

步骤 6:测试应用

        启动你的 Spring Boot 应用并调用 OrderService 的方法来发送一个事件。确保 RabbitMQ 服务正在运行,并且队列名称匹配。

package com.example.demo;import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import com.example.demo.services.OrderService;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@BeanCommandLineRunner runner(OrderService orderService) {return args -> {orderService.createOrder("12345");};}
}

步骤 7:部署到生产环境

        一旦本地测试通过,你可以将应用部署到生产服务器。确保生产环境中的 RabbitMQ 配置与开发环境保持一致。

        以上步骤详细说明了如何从零开始使用 Spring Boot 和 RabbitMQ 创建一个简单的事件驱动的订单处理系统。这为非专业人士提供了一个清晰的路径,以便理解和实施事件驱动架构。

总结

        事件驱动架构通过使用事件作为主要的通信方式,实现系统组件的高度解耦和动态互动。这种架构提供了高度的可扩展性和灵活性,特别适用于处理异步数据、实时响应以及构建微服务架构的系统。

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

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

相关文章

covid-vaccine-availability-using-flask-server

使用烧瓶服务器获得 Covid 疫苗 原文:https://www . geesforgeks . org/co vid-疫苗-可用性-使用-烧瓶-服务器/ 在本文中,我们将使用 Flask Server 构建 Covid 疫苗可用性检查器。 我们都知道,整个世界都在遭受疫情病毒的折磨,唯一能帮助我们…

设计模式从入门到精通之(三)单例模式

单例模式:只留一份独特的存在 在现代软件设计中,有些对象是必须确保"独一无二"的,比如程序中的配置管理器、线程池、数据库连接等。如果允许这些对象被反复创建,不仅会浪费系统资源,还可能导致程序逻辑出错。…

WordPress Crypto 插件 身份认证绕过漏洞复现(CVE-2024-9989)

0x01 产品简介 WordPress Crypto插件是指那些能够为WordPress网站提供加密货币支付、信息显示或交易功能的插件。这些插件通常与WordPress电子商务插件(如WooCommerce)集成,使网站能够接受多种加密货币支付,或展示加密货币实时信息。支持多种加密货币支付,付款直接进入钱…

hashMap追问

HashMap 7/8区别 不同点: (1)JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死…

网络安全:路由技术

概述 路由技术到底研究什么内容 研究路由器寻找最佳路径的过程 路由器根据最佳路径转发数据包 知识点,重要OSRF,BGP1.静态路由原理 路由技术分类 静态路由和动态路由技术 静态路由:是第一代路由技术,由网络管理员手工静态写路由/路径告知路…

IIS设置IP+端口号外网无法访问的解决方案

在IIS将站点设置为IP端口访问,假设端口为8080,设好后,服务器上可以访问,外网无法访问。 通常是端口8080没有加入【入站规则】的缘故,将8080端口加入【入站规则】即可,操作如下: 一、ctrlr 输入 …

使用 apply 方法将其他列的值传入 DataFrame 或 Series 的函数,来进行更灵活的计算或操作

可以使用 apply 方法将其他列的值传入 DataFrame 或 Series 的函数,来进行更灵活的计算或操作。apply 方法允许你逐行或逐列地对 DataFrame 或 Series 的元素进行操作,而且你可以将其他列的值作为参数传递给函数。 示例:使用 apply 结合其他…

计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

高速网络数据包处理中的内核旁路技术

该PPT详细介绍了Linux网络栈中数据包的传输路径、内核旁路技术的必要性以及具体的内核旁路技术,包括用户空间数据包处理和用户空间网络栈。主要内容概述: 数据包在Linux网络栈中的旅程:描述了数据包从发送到接收的完整路径,包括各…

el-form+el-date-picker组合使用时候的回显问题

背景 我有弹窗创建任务时间的需求,同时也可以修改任务时间,所以复用了弹窗和表单,但在表单里使用日期时间组件的时候,发现了问题 问题描述:在表单中使用form的属性绑定日期时间选择器的v-model,会出现的两…

分布式光伏规模界点为什么是6MW?

多省能源局规定大于6MW的电站必须按集中式管理,另外大于6MW(包含)要省级审批,小于则由市级审批,10kV线路单回接入容量也是6MW,很多电厂发电机装机容量也是以6MW为界点。这是什么原因呢? 配电网…

[2474].第04节:Activiti官方画流程图方式

我的后端学习大纲 Activiti大纲 1.安装位置: 2.启动:

Qt从入门到入土(七)-实现炫酷的登录注册界面(下)

前言 Qt从入门到入土(六)-实现炫酷的登录注册界面(上)主要讲了如何使用QSS样式表进行登录注册的界面设计,本篇文章将介绍如何对登录注册界面进行整体控件的布局,界面的切换以及实现登录、记住密码等功能。…

在 macOS 上,你可以使用系统自带的 终端(Terminal) 工具,通过 SSH 协议远程连接服务器

文章目录 1. 打开终端2. 使用 SSH 命令连接服务器3. 输入密码4. 连接成功5. 使用密钥登录(可选)6. 退出 SSH 连接7. 其他常用 SSH 选项8. 常见问题排查问题 1:连接超时问题 2:权限被拒绝(Permission denied&#xff09…

关于大一上的总结

大一上总结 前言 源于学长们都喜欢写总结,今晚也正好听见一首有点触动心灵的歌,深有感慨,故来此写下这篇总结 正文 1.暑假前的准备 暑假之前姑且还是学习了基本的C语法,大概是到了结构体的地方,进度很慢&#xff0…

Spring Cloud Gateway-自定义异常处理

参考 https://blog.csdn.net/suyuaidan/article/details/132663141,写法不同于注入方式不一样 ErrorWebFluxAutoConfiguration Configuration(proxyBeanMethods false) ConditionalOnWebApplication(type ConditionalOnWebApplication.Type.REACTIVE) Condition…

121.【C语言】数据结构之快速排序(未优化的Hoare排序存在的问题)以及时间复杂度的分析

目录 1.未优化的Hoare排序存在的问题 测试代码 "量身定制"的测试代码1 运行结果 "量身定制"的测试代码2 运行结果 "量身定制"的测试代码3 运行结果 分析代码1、2和3栈溢出的原因 排有序数组的分析 分析测试代码1:给一个升序数组,要求排…

如何使用 `uiautomator2` 控制 Android 设备并模拟应用操作_VIVO手机

在 Android 自动化测试中,uiautomator2 是一个非常强大的工具,能够帮助我们通过 Python 控制 Android 设备执行各种操作。今天,我将通过一个简单的示例,介绍如何使用 uiautomator2 控制 Android 设备,执行特定的应用启动、广告跳过以及其他 UI 操作。此示例的目标是自动化…

Swift Combine 学习(七):实践应用场景举例

Swift Combine 学习(一):Combine 初印象Swift Combine 学习(二):发布者 PublisherSwift Combine 学习(三):Subscription和 SubscriberSwift Combine 学习(四&…

使用 PyInstaller 和 hdiutil 打包 Tkinter 应用为 macOS 可安装的 DMG 文件

在这篇文章中,我们将逐步演示如何将基于 Python 的 Tkinter 应用程序打包成一个 macOS .app 文件,并将其封装为 .dmg 文件,供用户安装。 环境准备 在开始之前,请确保您的开发环境满足以下条件: macOS 系统。安装了 …