我的情况是:
我有多个网络服务器:
IBus.Publish/IBus.Subscribe
)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
}
答案 0 :(得分:1)
嗯,从技术上来说,没有任何东西可以阻止您在Web应用程序中发布消息,同样没有任何东西阻止您在同一Web应用程序的所有实例中订阅这些消息。问题是你是否应该:)
在不知道问题的详细信息的情况下,我的直接感觉是,您最好使用某种共享持久存储来处理您尝试同步的任何内容(缓存?),可能使用某种类型的如果您想扩展并快速读取,请阅读复制。
同样,在不知道问题细节的情况下,我会尝试提出一些建议,然后你可以看看是否可以激发你更好的解决方案......这里有:
bus.Send
向您的后端发送消息我建议使用这种替代解决方案的原因是,Web应用程序(至少在.NET版本中)具有这种有趣的瞬态特性,IIS将指示其生命周期,并且在任何给定时间您都可以拥有{{1}它的实例。如果你保持状态,这就很复杂。这使我将Web应用程序视为客户端,而不是发布者。
一个更简单的解决方案是将状态保持在不会出现的状态。去,例如一个数据库。我建议使用Mongo的原因是我的猜测是你担心能够快速提供Web请求,但是因为MongoDB很容易安装为副本集,其中读取操作将非常快(并且更多重要的是:水平可扩展),我的猜测是这种设置会使一切变得更加简单。
听起来怎么样?