Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 这是基于消息总线的发布子模式吗?_Go_Design Patterns_Publish Subscribe - Fatal编程技术网

Go 这是基于消息总线的发布子模式吗?

Go 这是基于消息总线的发布子模式吗?,go,design-patterns,publish-subscribe,Go,Design Patterns,Publish Subscribe,据此, 消息总线是一种消息基础设施,允许不同的系统通过一组共享的接口消息总线进行通信 以下是main启动的createHub函数和Run方法,用于创建消息中心,以便与多个订阅者通信发布者: type PubHub struct { subscribers map[*subscriptionmediator.HandlerSubscription]struct{} Register chan *subscriptionmediator.HandlerSubscription

据此,

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

以下是main启动的createHub函数和Run方法,用于创建消息中心,以便与多个订阅者通信发布者:

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
            }
        }
    }
}
1上述代码是否可以被视为遵循基于消息总线的发布子模式

2如何避免一个用户阻塞其余所有用户,使其无法在信道上发送信号?订户数据通道 上述代码是否可以被视为遵循基于消息总线的发布子模式


是。

无论如何称呼它:subscriber.DataChannel都会显示,以避免阻塞慢速或卡住的订户。集线器会删除缓冲数据通道中没有空间的订户。@CeriseLimón因此,如果客户端被阻止,则通过发送消息client来进行选择语法验证。send@CeriseLimón PubHub可以被视为上述消息集线器的一个实现吗?@overexchange请参阅有关使用默认值选择如何工作的描述。企业编程术语超出了我的专业范围。但是消息总线不应该阻塞一个订户…因为另一个订户运行缓慢,如comment@overexchange,也许您应该在问题中包含要使用的消息总线的定义。如果你这样做,答案可能会变得显而易见。@overexchange following[…a]模式与这是一个聪明的、合适的、生产性的……。@Peter你是指数据通道吗?我在查询中添加了。。。
    subscription := &subscriptionmediator.HandlerSubscription{
        conn,
        make(chan *events.Envelope),
    }
    hub.Register <- subscription
type HandlerSubscription struct {
    ConnInstance *websocket.Conn
    DataChannel  chan *events.Envelope
}