我的中间层MSMQ队列真的有必要吗?

时间:2013-10-25 09:39:32

标签: msmq rebus

我的情况是:

我有多个网络服务器:

  1. 需要与后端(IBus.Publish/IBus.Subscribe
  2. 进行通信
  3. 需要与彼此沟通(IBus.Publish/IBus.Subscribe
  4. 除了网络服务器之外,我还有许多使用相同消息的Windows服务。

    为了使这项工作成功,我让网络服务器向中央集线器发送消息,它将消息包装在新的消息类型中并将其发布给所有订户。

    我可以以某种方式避免这种情况,因此我可以直接从网络服务器发布消息吗?

    编辑(添加了一些代码) - 当前情况:

    ... WebServer
    _bus.Send(new Message{Body="SomethingChanged"});
    
    ... Hub
    public void Handle(Message message){
        _bus.Publish(new WrappedMessage{Message = message})
    }
    
    ... Handlers (WebServers, WindowsServices etc)
    public void Handle(WrappedMessage message){
        //Actually do important stuff
    }
    

    通缉情况:

    ... WebServer
    _bus.Publish(new Message{Body="SomethingChanged"};
    
    ... Handlers (WebServers, WindowsServices etc)
    public void Handle(Message message){
        //Do important stuff
    }
    

1 个答案:

答案 0 :(得分:1)

嗯,从技术上来说,没有任何东西可以阻止您在Web应用程序中发布消息,同样没有任何东西阻止您在同一Web应用程序的所有实例中订阅这些消息。问题是你是否应该:)

在不知道问题的详细信息的情况下,我的直接感觉是,您最好使用某种共享持久存储来处理您尝试同步的任何内容(缓存?),可能使用某种类型的如果您想扩展并快速读取,请阅读复制。

同样,在不知道问题细节的情况下,我会尝试提出一些建议,然后你可以看看是否可以激发你更好的解决方案......这里有:

  • 使用MongoDB(如果要扩展读取操作,可以作为副本集)作为要缓存的东西的持久存储
  • 每当Web应用程序发生某些事情时,bus.Send向您的后端发送消息
  • 在后端消息处理程序中,更新Mongo(它会自动复制以读取从属)
  • 每当您需要查询数据时,只需查询您的Mongo集(只要您可以接受稍微陈旧的值,就使用slaveOk = true)

我建议使用这种替代解决方案的原因是,Web应用程序(至少在.NET版本中)具有这种有趣的瞬态特性,IIS将指示其生命周期,并且在任何给定时间您都可以拥有{{1}它的实例。如果你保持状态,这就很复杂。这使我将Web应用程序视为客户端,而不是发布者。

一个更简单的解决方案是将状态保持在不会出现的状态。去,例如一个数据库。我建议使用Mongo的原因是我的猜测是你担心能够快速提供Web请求,但是因为MongoDB很容易安装为副本集,其中读取操作将非常快(并且更多重要的是:水平可扩展),我的猜测是这种设置会使一切变得更加简单。

听起来怎么样?