这是基于消息总线的发布-订阅模式吗?

ove*_*nge -3 design-patterns go publish-subscribe

根据这个答案

消息总线是一种消息传递基础结构,允许不同的系统通过一组共享的接口(消息总线)进行通信。

https://i.stack.imgur.com/5PkJy.gif


以下是创建消息中心以将发布者与多个订阅者进行通信所启动的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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

每个订阅者注册的地方,如下图:

    subscription := &subscriptionmediator.HandlerSubscription{
        conn,
        make(chan *events.Envelope),
    }
    hub.Register <- subscription
Run Code Online (Sandbox Code Playgroud)

DataChannel 用于发布者和多个订阅者之间的通信

type HandlerSubscription struct {
    ConnInstance *websocket.Conn
    DataChannel  chan *events.Envelope
}
Run Code Online (Sandbox Code Playgroud)

1) 是否可以将上述代码视为遵循基于消息总线的 pub-sub 模式?

2)如何避免一个订阅者阻止所有订阅者在频道上发信号? subscriber.DataChannel <- message

Vol*_*ker 5

可以考虑遵循基于消息总线的发布-订阅模式吗?

是的。

  • @overexchange“遵循[...a]模式”与“这是...的聪明、合适和生产实现吗”不同。 (2认同)