1

如果我想在 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 组件?我应该只发送消息而不是发布它们 - 不管这些消息指示事件而不是命令这一事实吗?

4

1 回答 1

4

NServiceBus 在某些情况下故意让事情变得困难,当您反对框架中的强烈意见时。这是一个这样的案例。

您遇到的问题在以下语句中:“此事件可以......由多个不同的逻辑服务发布。” 在 NServiceBus 中,每个事件都只有一个逻辑所有者。

好消息是,正如您所提到的,尽管只有一个逻辑所有者,但我们仍然能够从多个物理位置发布此事件。在这种情况下,您似乎有一个横切业务组件——类似于“操作”组件。该组件负责检测各个端点中的故障情况并在出现问题时发布。听起来对吗?

将单个组件分发到多个物理端点并没有错。事实上,这几乎是 NServiceBus 中的最佳实践。

于 2011-02-22T15:42:57.707 回答