2

我的情况是这样的:

我有多个网络服务器:

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

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

1 回答 1

1

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

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

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

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

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

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

听起来怎么样?

于 2013-10-29T08:38:37.533 回答