当前位置: 首页 > news >正文

EDA常见的拓扑结构

在事件驱动架构中,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<>();@Overridepublic void addProduct(String product) {products.add(product);System.out.println("Product added to cart: " + product);}@Overridepublic 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<>();@Overridepublic void registerListener(String eventType, EventListener listener) {listeners.computeIfAbsent(eventType, k -> new ArrayList<>()).add(listener);}@Overridepublic void dispatchEvent(String eventType, String message) {if (listeners.containsKey(eventType)) {for (EventListener listener : listeners.get(eventType)) {listener.onEvent(message);}}}
}// 各种系统作为事件监听器
public class PaymentSystem implements EventListener {@Overridepublic void onEvent(String message) {System.out.println("Payment System received: " + message);}
}public class InventorySystem implements EventListener {@Overridepublic 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 来解耦。


http://www.mrgr.cn/news/51839.html

相关文章:

  • 2024软考网络工程师笔记 - 第5章.无线通信网
  • DP—子数组,子串系列 第一弹 -最大子数组和 -环形子数组的最大和 力扣
  • 程序指针简史
  • Golang | Leetcode Golang题解之第486题预测赢家
  • linux日志分割工具logorate快速验证配置是否有效
  • 图像中的融合
  • HTML 标签简写及全称
  • AI学习指南深度学习篇-预训练模型的类型
  • 【回顾一下AQS知识,关于公平锁与非公平锁】
  • Python 列表专题:列表包含自身导致无线循环
  • 【C++11入门】新特性总结之移动语义(右值、右值引用、std::move()...)
  • 缓存穿透/击穿/雪崩(附生产BUG)
  • 【QT】常用控件(二)
  • SQL JOIN的学习
  • Golang | Leetcode Golang题解之第485题最大连续1的个数
  • 会议点名人员crud-web前端Vue3多选调用示例
  • PHP中‘BITWISE AND‘运算符和‘LOGICAL AND‘运算符的区别
  • 985研一学习日记 - 2024.10.17
  • 数据库中存储树状关系的数据
  • Linux:线程