核心命题
发布 - 订阅模式通过引入消息代理(Broker),实现发布者和订阅者的完全解耦,使两者不需要知道彼此的存在。
Note
- 发布者和订阅者完全不直接通信
- 通过消息代理/事件通道(Event Bus)解耦
- 支持一对多的消息通知
运行机制
核心流程
- 创建消息代理(Broker):管理发布者和订阅者之间的消息传递
- 订阅者注册:向消息代理订阅感兴趣的主题
- 发布者发布:将消息发布到消息代理
- 消息分发:消息代理将消息传递给所有订阅者
代码实现
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 |
| 微服务 | 服务间消息队列、事件总线 |
注意事项
| 问题 | 解决方案 |
|---|---|
| 消息丢失 | 消息持久化、重试机制 |
| 消息顺序 | 消息队列、顺序保证 |
| 性能瓶颈 | 限流、批量处理、异步队列 |
知识图谱
- 父级概念:设计模式
- 关联概念:
- 观察者模式 — 发布订阅的基础
- 观察者模式 vs 发布订阅模式 — 两者对比
- 相关模式:EventBus、消息队列、观察者模式
参考延伸
- Refactoring Guru: Publish-Subscribe Pattern
- 《Head First Design Patterns》
- Node.js EventEmitter 实现