go - 这是基于消息总线的发布-订阅模式吗?
问题描述
根据这个答案,
消息总线是一种消息基础设施,允许不同的系统通过一组共享的接口(消息总线)进行通信。
以下是创建消息中心以将发布者与多个订阅者通信的createHub()
函数和Run()
方法:main()
type PubHub struct {
subscribers map[*subscriptionmediator.HandlerSubscription]struct{}
Register chan *subscriptionmediator.HandlerSubscription
Unregister chan *subscriptionmediator.HandlerSubscription
Broadcast chan *events.Env
}
func createHub() *PubHub {
return &PubHub{
subscribers: map[*subscriptionmediator.HandlerSubscription]struct{}{},
Register: make(chan *subscriptionmediator.HandlerSubscription),
Unregister: make(chan *subscriptionmediator.HandlerSubscription),
Broadcast: make(chan *events.Envelope),
}
}
func (h *PubHub) Run() {
for {
select {
case subscriber := <-h.Register:
h.subscribers[subscriber] = struct{}{}
case subscriber := <-h.Unregister:
if _, ok := h.subscribers[subscriber]; ok {
delete(h.subscribers, subscriber)
}
case message := <-h.Broadcast:
for subscriber := range h.subscribers {
subscriber.DataChannel <- message
}
}
}
}
每个订阅者注册的地方,如下图:
subscription := &subscriptionmediator.HandlerSubscription{
conn,
make(chan *events.Envelope),
}
hub.Register <- subscription
DataChannel
用于发布者和多个订阅者之间的通信
type HandlerSubscription struct {
ConnInstance *websocket.Conn
DataChannel chan *events.Envelope
}
1) 上面的代码可以考虑遵循基于消息总线的发布-订阅模式吗?
2)如何避免一个订阅者阻止所有订阅者在频道上发信号?subscriber.DataChannel <- message
解决方案
上面的代码可以考虑遵循基于消息总线的发布-订阅模式吗?
是的。
推荐阅读
- sql - SELECT 从两个表中获取结果,其中一个值仅在表列中出现一次
- javascript - 如何按角度对 1 月到 12 月的月份列表进行排序?
- python - TypeError: format: a number is required, not str
- logstash - 配置 FileBeat 以组合所有日志而不使用多行模式
- encryption - 可以在同一张表中使用 AES 256 存储盐和加密的 SSN
- c# - 如何将二进制流插入varbinary?
- typescript - express-jwt-authz 和打字稿
- html - 错误类型错误:无法读取未定义角度 5 的属性“无效”
- python - ScrollLabel 产生 ValueError
- reactjs - 减速器的奇怪错误