来自多个源的订户的NServiceBus事件

时间:2011-02-22 12:42:18

标签: nservicebus cross-cutting-concerns

如果我想在nservicebus中描述一个事件,我会创建一个从服务发布并由一个或多个订阅者使用的接口。

让我们称之为“systemerror”。每次到达代码中的某个点时,我们都会发布此事件,我们无法再执行某些操作。

所以这个事件最终可以由多个不同的逻辑服务发布。在只有一个发布此“systemerror”的服务的情况下,让我们查看来自订阅者的配置文件

<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组件处理这种情况? 我应该发送消息而不是发布它们 - 不管这些消息是指示事件而不是命令?

1 个答案:

答案 0 :(得分:4)

NServiceBus在某些情况下,当你反对框架中的强烈意见时,故意使事情变得艰难。就是这种情况。

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

好消息是,尽管存在一个逻辑所有者,我们仍然能够从多个物理位置发布此事件,如您所述。在这种情况下,您似乎拥有一个跨领域的业务组件 - 类似于“操作”组件。该组件负责检测各个端点中的故障情况,并在出现问题时进行发布。听起来不错吗?

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