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

Posted

技术标签:

【中文标题】这是基于消息总线的发布-订阅模式吗?【英文标题】:Is this a message bus based pub-sub pattern? 【发布时间】:2020-09-21 16:42:46 【问题描述】:

据此answer,

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


以下是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
            
        
    


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

    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 &lt;- message

【问题讨论】:

不管怎么称呼它:subscriber.DataChannel &lt;- message 这是阻塞,这意味着一个缓慢或(更糟)卡住的订阅者会阻塞整个世界。 @CeriseLimón 那么,select 语法是否通过发送消息 (client.send &lt;- message) 来验证客户端是否被阻止?如果不成功,则运行default 案例并关闭频道... @CeriseLimón 可以将PubHub 视为here 提到的消息中心的实现吗? @CeriseLimón 相关问题:***.com/questions/69641809/… 【参考方案1】:

上面的代码可以被认为是遵循基于消息总线的发布-订阅模式吗?

是的。

【讨论】:

但是消息总线不应该阻塞一个订阅者......由于另一个订阅者运行缓慢,如评论中所述 @overexchange,也许您应该在问题中包含要使用的消息总线的定义。如果你这样做,答案可能会变得显而易见。 @overexchange “遵循 [... a] 模式”与“这是一个聪明、合适的生产实现...”不同。 @Peter 你是说DataChannel吗?我已在查询中添加...

以上是关于这是基于消息总线的发布-订阅模式吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中模拟消息总线?

EventBus 3.0使用与源码分析

EventBus 3.0使用与源码分析

EventBus 3.0使用与源码分析

具有相同订阅的服务总线多个侦听器实例未接收消息

领域事件