首页 > 其他分享 >EDA常见的拓扑结构

EDA常见的拓扑结构

时间:2024-10-17 18:20:57浏览次数:3  
标签:EDA String Mediator 拓扑 常见 Broker void 组件 public

在事件驱动架构中,Mediator 和 Broker 是两种常见的拓扑结构,它们分别是用来管理和传递事件或消息的组件。尽管它们都涉及事件的传递,但其运作方式和使用场景有所不同。

1. Mediator(中介者模式)
  • 定义:Mediator 是一种中介模式,负责协调不同组件之间的交互,通过控制和转发消息来减少组件间的直接依赖和耦合。Mediator 作为一个中心化的组件,管理所有的交互流程,所有组件的消息都经过它来进行转发。

  • 原理

    • 在 Mediator 模式中,各个组件不会直接相互通信,而是通过 Mediator 进行消息传递。
    • Mediator 负责接收来自一个组件的消息,并根据需要将其转发给其他相关组件。
    • Mediator 模式具有明确的流程和控制机制,可以集中管理复杂的组件交互。
  • 工作流程

    1. 组件(比如UI中的按钮或输入框)发出某种操作或事件。
    2. 这些事件通过 Mediator 传递,Mediator 根据业务逻辑或规则将消息转发给其他组件。
    3. 通过 Mediator,组件之间的相互依赖减少,解耦变得更加清晰。
  • 例子:想象一个在线购物系统,购物车、商品列表、用户信息都作为独立组件工作。当用户点击“购买”按钮时,商品列表、用户信息和购物车等组件的状态都可能受到影响。Mediator 将充当中心,协调这些组件的交互,确保它们的状态一致。

2. Broker(代理模式)
  • 定义:Broker 是一种事件驱动模式,无中心、无固定流程,负责在发布者和订阅者之间传递消息。Broker 模式不控制流程,它只是充当“中介”,负责消息的转发。消息的发布者和消费者之间并不直接通信,而是通过 Broker 进行通信。Broker 作为一个解耦的组件,不干涉消息的处理流程

  • 原理

    • 组件(如发布者或消费者)只需通过 Broker 注册和订阅消息,而无需知道彼此的存在。
    • Broker 模式没有中心控制,消息的分发由 Broker 负责,但没有明确的消息传递流程或业务规则。
    • 消息可以是异步的,允许多个系统之间解耦。
  • 工作流程

    1. 发布者向 Broker 发布消息。
    2. 消费者(多个)可以订阅感兴趣的事件或消息。
    3. Broker 将消息发送给所有已订阅的消费者。
    4. 发布者和消费者之间没有直接的连接,所有交互都通过 Broker 进行。
  • 例子:在电子商务系统中,订单创建时需要通知库存、支付、发货等多个系统。通过 Broker 模式,订单创建事件可以发布到 Broker,Broker 会将这个事件推送给所有相关的系统,确保各个系统能够处理相关业务。

区别总结:

特性MediatorBroker
角色中介者,管理消息和事件的转发代理,负责传递消息,但不控制流程
控制由 Mediator 控制事件的流转和处理无中心控制,消息由发布者和消费者直接交互
组件交互组件之间的交互通过 Mediator 进行,遵循明确的交互流程发布者和消费者通过 Broker 注册和订阅消息,没有固定的处理流程
适用场景适合较小范围的组件协调,UI 系统、复杂的内部交互等适合大规模的异步系统,事件驱动的分布式系统

Mediator模式的流程(举例)

假设我们有一个购物车系统,包括商品列表、购物车和支付信息。Mediator 负责协调这些组件。

组件结构:
  • ProductList(商品列表):用户选择商品时添加到购物车。
  • ShoppingCart(购物车):负责保存选中的商品。
  • User(用户):从购物车中移除商品。

Mediator 充当中心角色,协调这些组件的交互。

// Mediator 接口
public interface ShoppingCartMediator {
    void addProduct(String product);
    void removeProduct(String product);
}

// 购物车类
public class ShoppingCart implements ShoppingCartMediator {
    private List<String> products = new ArrayList<>();

    @Override
    public void addProduct(String product) {
        products.add(product);
        System.out.println("Product added to cart: " + product);
    }

    @Override
    public void removeProduct(String product) {
        products.remove(product);
        System.out.println("Product removed from cart: " + product);
    }
}

// 商品列表类
public class ProductList {
    private ShoppingCartMediator mediator;

    public ProductList(ShoppingCartMediator mediator) {
        this.mediator = mediator;
    }

    public void selectProduct(String product) {
        mediator.addProduct(product);
    }
}

// 用户类
public class User {
    private ShoppingCartMediator mediator;

    public User(ShoppingCartMediator mediator) {
        this.mediator = mediator;
    }

    public void removeFromCart(String product) {
        mediator.removeProduct(product);
    }
}

// 代码示例
public class Main {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
        ProductList productList = new ProductList(cart);
        User user = new User(cart);

        // 用户选择商品
        productList.selectProduct("Laptop");
        productList.selectProduct("Phone");

        // 用户从购物车中删除商品
        user.removeFromCart("Laptop");
    }
}

Broker模式的流程(举例)

假设在一个电商系统中,订单创建时需要通知多个系统(如支付系统、库存系统等)。这时,Broker 模式适用于解耦和异步处理。

组件结构:
  • OrderCreatedEvent(订单创建事件):发布订单创建事件。
  • PaymentSystem(支付系统):处理订单支付。
  • InventorySystem(库存系统):更新库存。

Broker 作为中介者,发布消息并将事件通知给所有订阅者。

// Broker 接口
public interface EventBroker {
    void registerListener(String eventType, EventListener listener);
    void dispatchEvent(String eventType, String message);
}

// 事件监听器接口
public interface EventListener {
    void onEvent(String message);
}

// 实现一个消息经纪人
public class OrderEventBroker implements EventBroker {
    private Map<String, List<EventListener>> listeners = new HashMap<>();

    @Override
    public void registerListener(String eventType, EventListener listener) {
        listeners.computeIfAbsent(eventType, k -> new ArrayList<>()).add(listener);
    }

    @Override
    public void dispatchEvent(String eventType, String message) {
        if (listeners.containsKey(eventType)) {
            for (EventListener listener : listeners.get(eventType)) {
                listener.onEvent(message);
            }
        }
    }
}

// 各种系统作为事件监听器
public class PaymentSystem implements EventListener {
    @Override
    public void onEvent(String message) {
        System.out.println("Payment System received: " + message);
    }
}

public class InventorySystem implements EventListener {
    @Override
    public void onEvent(String message) {
        System.out.println("Inventory System received: " + message);
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        EventBroker broker = new OrderEventBroker();

        // 注册监听器
        broker.registerListener("orderCreated", new PaymentSystem());
        broker.registerListener("orderCreated", new InventorySystem());

        // 当订单创建时,通知所有注册的系统
        broker.dispatchEvent("orderCreated", "New order created with ID: 12345");
    }
}

通过以上例子可以看到,在 Mediator 模式下,组件之间通过 Mediator 进行交互,而在 Broker 模式下,消息的发布者和订阅者之间通过 Broker 来解耦。

标签:EDA,String,Mediator,拓扑,常见,Broker,void,组件,public
From: https://blog.csdn.net/pumpkin84514/article/details/142993003

相关文章

  • Python中3个常见网络爬虫库
    在Python中,requests、Scrapy和Selenium是三个非常流行的库,它们都可以用来开发网络爬虫,但各有特点和适用场景,今天我们学习下它们的区别,便于我们日常使用选择。Requests:用途:是一个简单易用的HTTP库,用于发送网络请求。它允许你轻松地发送HTTP/1.1请求,无需手动添加查询字符串......
  • 常见的缓存淘汰算法
    应用场景:缓存淘汰算法可以广泛应用于任何有缓存淘汰需求的场景,并不仅限于某个特定的插件或工具。许多软件和系统,如数据库(Redis、Memcached)、Web服务器(Nginx、Varnish)、内容分发网络(CDN)、浏览器缓存、甚至操作系统的内存管理,都会使用这些算法来决定在缓存空间满时该移除哪些数据......
  • 拓扑结构
     T点拓扑结构:T点拓扑结构又叫星型拓扑结构,树形拓扑结构。    ......
  • 常见ElasticSearch 面试题解析(上)
    前言ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,......
  • 常见Elasticsearch 面试题答案详细解析(下)
    前言1.Elasticsearch是一个分布式的RESTful风格的搜索和数据分析引擎。(1)查询:Elasticsearch允许执行和合并多种类型的搜索—结构化、非结构化、地理位置、度量指标—搜索方式随心而变。(2)分析:找到与查询最匹配的十个文档是一回事。但是如果面对的是十亿行日志,又该......
  • 常见的Linux面试题及答案解析,哪些你还不会?
    Linux面试题1、绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示?切换目录用什么命令?2、怎么查看当前进程?怎么执行退出?怎么查看当前路径?3、怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当前用户id?查看指定帮助用什么命令?4、Ls命令执行什么功能?可......
  • 高级java每日一道面试题-2024年10月17日-Web篇-常见的web攻击有哪些?
    如果有遗漏,评论区告诉我进行补充面试官:常见的web攻击有哪些?我回答:常见的Web攻击种类繁多,攻击者利用各种漏洞和技术手段来入侵网站、窃取数据或破坏服务。以下是一些最常见的Web攻击类型及其简要说明:1.SQL注入(SQLInjection,SQLi)描述:攻击者通过在输入字段......
  • FreeIPCC开源呼叫中心:呼叫中心 IVR常见的功能
    呼叫中心中的IVR(InteractiveVoiceResponse)即交互式语音应答系统,是一种功能强大的自动化电话服务系统。它通过预先录制或TTS(TextToSpeech,文本转语音)技术合成的语音进行自动应答,为呼叫者提供菜单导航功能。以下是呼叫中心IVR常见的功能介绍:自助服务:IVR系统能够根据呼叫者的......
  • 常见问题——C#未能找到路径“\bin\roslyn\csc.exe”的一部分
    1.主要原因是因为两个库存在,需要生成一个roslyn文件那么就删除这两个关联的库,就可以达到目的删去项目中的这两天引用:Microsoft.CodeDom.Providers.DotNetCompilerPlatformMicrosoft.Net.Compilers2.删除web.config中加载的这个依赖的代码段<system.codedom><compilers......
  • Python--WinError 2 的常见解决方案
    报错信息:FileNotFoundError:[WinError2]系统找不到指定的文件。这个错误提示FileNotFoundError:[WinError2]系统找不到指定的文件说明在调用subprocess.Popen时,系统找不到指定的文件或可执行程序。在代码中,这个问题主要是因为找不到JavaJAR文件meteor-1.5.jar,也......