发布/订阅(Publish/Subscribe)是一种消息传递模式,其中消息发布者(Publisher)将消息发送到一个消息队列或主题(Topic),而订阅者(Subscriber)则从这个队列或主题中订阅消息。当新的消息被发布到队列或主题中时,所有订阅者都会收到这个消息。
on/ emit / off是较为常见的几种订阅模式
注意这种设计模式有几点特征:
- 发布者和订阅者之间是松耦合的,发布者不需要知道谁订阅了消息,订阅者也不需要知道消息来自哪个发布者。
- 这种模式使得系统中的组件之间可以相互独立,降低了系统的复杂性,同时也提高了系统的可扩展性和可维护性。
- 发布/订阅模式在许多场景中都有广泛的应用,比如消息队列、事件驱动架构、分布式系统等。
实现手写的示例代码:
const EvenHub = {
queueMap : {},
on: function(name, fn) {
EvenHub.queueMap[name] = EvenHub.queueMap[name] || []
EvenHub.queueMap.push(fn)
},
emit: function(name, fn) {
const q = EvenHub.queueMap[name]
if(!q){ return }
q.map(fn => fn.call(null, data))
return undefined
},
off: function(name, fn) {
//alias别名
const q = EvenHub.queueMap[name]
if(!q){return}
const index =q.indexOf(fn)
if(q <= 0) {return }
q.splice(index, 1)
}
}
使用方式:
EvenHub.on('click', console.log('hi'))
setTimeout(()=>{
EvenHub.emit('click', console.log('我是trigger'))
}, 3000)
概念解析Tips:
- 消息代理(Message Broker):负责将消息从发布者发送到订阅者,通常使用消息队列实现。
- 主题(Topic):消息发布者发布消息的地址或通道,订阅者可以订阅一个或多个主题。
- 订阅者(Subscriber):接收并处理来自主题的消息的组件或服务。
- 发布者(Publisher):将消息发布到主题的组件或服务。
- 事件(Event):指系统中发生的某些状态或动作,可以作为消息发布到主题中。
- 观察者模式(Observer Pattern):一种与发布/订阅模式类似的设计模式,其中主题维护一个观察者列表,当主题状态发生变化时,通知所有观察者。
- 可靠性保证:在发布/订阅模式中,需要确保消息能够可靠地传递到订阅者,通常使用ACK机制和持久化存储来保证可靠性。