猿问

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

根据这个答案

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

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



以下是创建消息中心以将发布者与多个订阅者通信的createHub()函数和Run()方法:main()


MM们
浏览 164回答 1
1回答

手掌心

上面的代码可以考虑遵循基于消息总线的发布-订阅模式吗?是的。
随时随地看视频慕课网APP

相关分类

Go
我要回答