核心命题

发布 - 订阅模式通过引入消息代理(Broker),实现发布者和订阅者的完全解耦,使两者不需要知道彼此的存在。

Note

  • 发布者和订阅者完全不直接通信
  • 通过消息代理/事件通道(Event Bus)解耦
  • 支持一对多的消息通知

运行机制

核心流程

  1. 创建消息代理(Broker):管理发布者和订阅者之间的消息传递
  2. 订阅者注册:向消息代理订阅感兴趣的主题
  3. 发布者发布:将消息发布到消息代理
  4. 消息分发:消息代理将消息传递给所有订阅者

代码实现

class Broker {
  constructor() {
    this.topics = {};
  }
 
  subscribe(topic, callback) {
    if (!this.topics[topic]) {
      this.topics[topic] = [];
    }
    this.topics[topic].push(callback);
  }
 
  publish(topic, data) {
    if (this.topics[topic]) {
      this.topics[topic].forEach(callback => callback(data));
    }
  }
}
 
// 使用
const broker = new Broker();
 
broker.subscribe("news", data => console.log("Subscriber 1:", data));
broker.subscribe("news", data => console.log("Subscriber 2:", data));
 
broker.publish("news", "Hello!");
// Subscriber 1: Hello!
// Subscriber 2: Hello!

应用场景

场景说明
事件驱动架构构建异步通信和解耦的事件系统
实时通信聊天应用、在线游戏、消息推送
组件通信跨组件状态通知,如 EventBus
状态管理Redux 中间件、Vue EventBus
微服务服务间消息队列、事件总线

注意事项

问题解决方案
消息丢失消息持久化、重试机制
消息顺序消息队列、顺序保证
性能瓶颈限流、批量处理、异步队列

知识图谱


参考延伸