发布订阅模式
1. 核心定义
- 本质:一种消息通信范式,通过引入一个“中间人”角色,使发布者 (Publisher) 和 订阅者 (Subscriber) 彻底解耦。
- 口诀:发布者只管发,订阅者只管听,中间人管名单和分发。
2. 三大核心角色
- 发布者 (a方法):触发事件的角色。它不需要知道谁订阅了它,只需向中间人“呼喊”一声。
- 订阅者 (b, c方法):接收消息的角色。它向中间人注册一个回调函数,静候通知。
- 中间人 (Broker/Event Bus):最关键的角色。
- 职责一:提供
subscribe接口,维护一个**“主题 -> 回调数组”**的档案柜。 - 职责二:提供
publish接口,当事件发生时,翻阅档案,依次执行对应的回调列表。
3. 为什么需要它?(模式的目的)
- 空间解耦:A 和 B 互不认识,修改 A 不影响 B。
- 时间解耦:在高级实现中,发布者发完就走,订阅者可以异步处理(不用死等)。
- 逻辑清晰:把“业务逻辑”和“善后逻辑”拆分。比如:订票逻辑(主) vs 发短信、扣积分(副)。
4. 实现的技术细节(底层原理)
存储机制:通常在中间人内部维护一个
Map<String, Array<Function>>。执行方式:
单机版:遍历回调函数数组,同步/异步依次执行。
分布式版 (如 Kafka):基于磁盘日志追加写入,订阅者通过偏移量 (Offset) 自行拉取。
健壮性设计:
异常隔离:使用
try...catch包裹回调,防止一个订阅者报错导致全线崩溃。防止死循环:警惕在回调中再次发布同一事件引起的“递归套娃”。
内存管理:提供
off(取消订阅) 或once(阅后即焚) 功能,防止内存泄漏。
5. 常见应用场景
- 前端:DOM 事件监听、Vue/React 的组件通信。
- 后端:分布式系统中的消息队列(Kafka, RabbitMQ, Redis Pub/Sub)。
- 生活:微信公众号订阅、报纸订购、抖音关注。
💡 核心感悟:
发布订阅模式不仅是代码技巧,更是一种组织哲学——通过牺牲一点点性能(引入中间人)来换取整个系统极大的灵活性和可扩展性。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 YianNotes!

