No title

title: 事件总线(Event Bus)
date: 2025-06-06 17:57:04
tags:

事件总线(Event Bus)

事件总线是一种软件架构模式,它允许不同组件之间通过发布(publish)和订阅(subscribe)事件来进行通信,而不需要这些组件直接引用彼此。这种模式常被称为”发布-订阅”(Pub-Sub)模式。

image-20250629003650058

核心概念

  1. 事件(Event): 表示系统中发生的某件事情,通常包含事件类型和相关数据
  2. 发布者(Publisher): 产生事件并将其发送到事件总线的组件
  3. 订阅者(Subscriber): 对特定类型事件感兴趣并从事件总线接收这些事件的组件
  4. 事件总线(Event Bus): 中间件,负责接收发布者的事件并将其分发给订阅者

基本工作流程

  1. 订阅者向事件总线注册,表明它们对哪些类型的事件感兴趣
  2. 发布者将事件发送到事件总线
  3. 事件总线将事件分发给所有对该事件类型感兴趣的订阅者
  4. 订阅者接收事件并作出相应处理

事件总线的优势

  1. 松耦合: 发布者和订阅者不需要直接了解彼此,减少了系统各部分之间的依赖
  2. 可扩展性: 新组件可以轻松集成到系统中,只需订阅相关事件
  3. 灵活性: 可以动态添加或移除订阅者,而不影响其他组件
  4. 简化通信: 提供了统一的消息传递机制,简化了组件间的通信

事件总线实现方式

1. 内存中的事件总线

最简单的实现是在单个应用程序内存中运行的事件总线。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class EnventBus{
private:
map<string,vector<Subscriber*> subscribers;
public:
void Subscribe(string eventType,Subscriber* subscriber){
subscribers[eventType].push_back(subscriber);
}
//发布事件
void PostEvent(Event event){
string eventType = event.GetType();
if(subscribers.find(eventType)! = subscribers.end()){
for(auto subscriber:subscribers[eventType]){
subscriber->HandleEvent(event);
}
}
}
}

2.分布式事件总线

在分布式系统中,事件总线可以跨越多个进程或服务器:

  • 消息队列系统: 如RabbitMQ, Kafka, ActiveMQ等
  • 服务总线: 如Azure Service Bus, Amazon EventBridge等

进阶概念

事件过滤和路由

更复杂的事件总线实现可能包括:

  • 事件过滤: 基于事件属性或模式进行筛选
  • 路由规则: 根据特定规则将事件发送给不同的订阅者

事件处理保证

  • 至少一次递送: 确保每个事件至少被处理一次
  • 最多一次递送: 确保事件不会被重复处理
  • 恰好一次递送: 确保每个事件被处理一次且仅一次

事件存储和重放

  • 事件存储: 保存事件历史记录
  • 事件重放: 能够重新处理历史事件,用于系统恢复或数据重建

实际应用场景

  1. GUI应用程序

在图形界面应用中,事件总线用于处理用户交互:

  • 按钮点击、菜单选择等UI事件
  • 不同UI组件之间的通信
  1. 微服务架构

在微服务系统中,事件总线用于:

  • 服务间的异步通信
  • 实现事件驱动架构
  • 处理分布式事务
  1. 物联网(IoT)系统

在IoT应用中:

  • 设备发布传感器数据事件
  • 控制系统订阅这些事件并作出响应