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



我的场景是这样的:

我有多个网络服务器:

  1. 需要与后端通信(IBus.Publish/IBus.Subscribe
  2. 需要相互沟通 ( IBus.Publish/IBus.Subscribe

除了Web服务器之外,我还有许多使用相同消息的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
}

好吧,从技术上讲,没有任何内容可以阻止您在 Web 应用程序内发布消息,同样,也没有什么可以阻止您在同一 Web 应用程序的所有实例中订阅这些消息。问题是你是否应该:)

在不知道问题的细节的情况下,我的直接感觉是,对于您尝试同步的任何内容(缓存?),最好使用某种共享持久存储,如果您想横向扩展并使读取速度非常快,可能会使用某种读取复制。

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

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

我建议这种替代解决方案的原因是,Web应用程序(至少在.NET土地上)具有这种有趣的瞬态性质,IIS将决定其生命周期,并且在任何给定时间,您都可以拥有它的n实例。如果您将状态保留在其中,这将使事情复杂化。这使我认为 Web 应用程序是客户端,而不是发布者。

一个更简单的解决方案是将状态保留在不会来来去去的东西中,例如数据库。我建议使用Mongo的原因是,我的猜测是你担心能够快速为Web请求提供服务,但是由于MongoDB相当容易安装为副本集,其中读取操作将非常快(更重要的是:可伸缩),我的猜测是这种设置将使一切变得更加简单。

听起来怎么样?

最新更新