观察者模式可通过异步调度实现非阻塞通知,核心是将通知动作从主线程剥离,交由线程池、协程或goroutine执行;引入事件总线解耦发布者与订阅者;利用Channel/Flow构建通信管道;并需控制并发、超时、重试及错误监控。

观察者模式本身是同步的,但通过引入异步调度机制,就能实现非阻塞、高响应的事件通知。关键不是改写模式本质,而是把“通知动作”从主线程中剥离出来,交由独立执行单元处理。
用线程池或协程解耦通知过程
发布者(Subject)在状态变更后,不再直接调用每个观察者的 update() 方法,而是将通知任务提交给异步执行器:
- Java 中可使用 ExecutorService 提交 Runnable,让每个 Observer 的处理在工作线程中运行
- Kotlin 中配合 CoroutineScope + Dispatchers.IO,在协程中调用 update,避免卡住 UI 线程
- Go 中启动 goroutine 执行 observer.Update(),天然轻量且并发安全
引入事件总线做中间层
避免 Subject 和 Observer 直接持有彼此引用,用 EventBus 作为统一中转站:
- Subject 只负责向 EventBus post 一个语义清晰的事件对象(如 OrderPaidEvent)
- Observer 向 EventBus subscribe 特定类型事件,不关心谁发布的
- EventBus 内部可用内存队列(如 Disruptor)、goroutine 池或 Kafka 实现异步投递
用 Channel 或 Flow 构建通信管道
在 Go 或 Kotlin 等支持原生并发的语言中,用通信代替调用更自然:
- Go:Subject 向每个 Observer 的 eventCh channel 发送事件,Observer 在自己的 goroutine 中 select 接收
- Kotlin:用 StateFlow 或 SharedFlow 替代手动维护观察者列表,collect 即订阅,发射即通知
- Channel/Flow 天然支持背压、缓冲、超时和取消,比回调更可控
控制并发与错误处理
异步不等于放任,需防止资源耗尽或失败静默:
- 限制最大并发数,比如 Go 中用带缓冲的信号 channel 控制 goroutine 数量
- 为每个异步通知添加超时和重试逻辑,尤其在依赖外部服务(如发邮件、调第三方 API)时
- 订阅端应记录失败日志,并支持监控告警,确保事件不丢失、可观测


















