如果我想在 nservicebus 中描述一个事件,我将创建一个从服务发布并由一个或多个订阅者使用的接口。
让我们将事件称为“系统错误”。每次到达代码中的某个点而我们无法进一步执行某些操作时,都会发布此事件。
所以这个事件最终可以由多个不同的逻辑服务发布。在只有一个服务发布此“系统错误”的情况下,让我们查看订阅者的配置文件
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="SystemErrorMessages" Endpoint="appserviceQueue" />
</MessageEndpointMappings>
</UnicastBusConfig>
好的,到目前为止没问题。但是如果我们有两个发布这个事件的服务呢?
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="SystemErrorMessages" Endpoint="appserviceQueue" />
<add Messages="SystemErrorMessages" Endpoint="transportQueue" />
</MessageEndpointMappings>
</UnicastBusConfig>
这不是一个有效的配置,因为有 2 个名为“SystemErrorMessages”的消息条目。
我们可以从“systemerror”事件继承,这样每个逻辑服务都会发布自己的“systemerror”,例如“appservice_systemerror”和“transportservice_systemerror”。
订阅者的配置如下所示:
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="AppService_SystemErrorMessages" Endpoint="appserviceQueue" />
<add Messages="TransportService_SystemErrorMessages" Endpoint="transportQueue" />
</MessageEndpointMappings>
</UnicastBusConfig>
但是如果我们在两台或更多台不同的机器上安装逻辑服务“transportservice”会是什么方法呢?所以我们有两个逻辑服务,其中一个服务安装在两个物理位置。
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="AppService_SystemErrorMessages" Endpoint="appserviceQueue" />
<add Messages="TransportService_SystemErrorMessages" Endpoint="transportQueue1" />
<add Messages="TransportService_SystemErrorMessages" Endpoint="transportQueue2" />
</MessageEndpointMappings>
</UnicastBusConfig>
对于这样的问题,有什么可能的解决方案?是否有处理此类情况的任何 nservicebus 组件?我应该只发送消息而不是发布它们 - 不管这些消息指示事件而不是命令这一事实吗?