在NServiceBus 6中,端点是否可以在不知道发布端点的情况下订阅事件?

时间:2017-06-16 17:05:58

标签: c# nservicebus publish-subscribe

我已更新到NServiceBus 6,其中IProvideConfiguration<UnicastBusConfig>及其MessageEndpointMappings已过时。

我已按照文档中的发布/订阅说明进行操作。据我了解,现在需要在订阅事件时明确命名发布端点。

之前,我可以指定事件接口,端点将是订户的名称:

config.MessageEndpointMappings.Add(
                new MessageEndpointMapping
                {
                    AssemblyName = MyAssemblyName,
                    TypeFullName = typeof( IMyEvent ) ),
                    Endpoint = "SubscribingEndpoint"
                } );

现在: 这消失了,我有以下。这完全取代了对IProvideConfiguration类的需求:

    var routing = endpointConfiguration.UseTransport<MsmqTransport>().Routing();
    endpointConfiguration.SendFailedMessagesTo( "error" );
    endpointConfiguration.AuditProcessedMessagesTo( "audit" );
    //register command
    routing.RouteToEndpoint( typeof( MyCommand), "SomeEndpoint" );
    //subscribe to event
    routing.RegisterPublisher(typeof(IMyEvent), "PublishingEndpoint" ); //?

所以在这里我必须指定IMyEvent的发布者,而不是订阅者。 在NSB5中,这不是必需的。

那么如果事件是由多个端点发布的,我该怎么办?

1 个答案:

答案 0 :(得分:1)

回答你的问题:

  

那么如果事件是由多个端点发布的,我该怎么办?

您可以通过来自订阅者的多个RegisterPublisher来自多个发布商订阅相同的活动。

请注意,如果从多个逻辑端点发布相同的事件,通常会将其视为气味。您可能需要考虑为每个逻辑端点使用不同的事件类型,或者可以从事件切换到命令。如果您对邮件设计不确定,强烈建议您访问Particular Software Google Group,我们非常乐意为您提供设计问题,以解决此问题。

关于V5和V6之间的变化:

  

在NSB5中,订阅者将通过在MessageEndpointMapping中使用自己的端点名称而不是发布者的端点名称来订阅,如上所示。

我很难听完这个说法。 V5和V6使用相同的方法进行订阅,只是使用不同的语法。

由于您使用的是MSMQ,因此订阅者必须向每个事件发布者发送订阅消息。为了使订户知道在哪里发送订阅消息,它需要路由信息。这是V5和V6使用不同语法的地方:

  • V5将在其MessageEndpointMappings中查找匹配的路由。它会将订阅消息发送到映射中指定的端点(在示例代码中为SubscribingEndpoint)。
  • V6强制订阅消息和命令之间的分离。这就是为什么有不同的API用于路由常规命令和路由订阅消息。基于代理的传输(例如RabbitMQ)不需要订阅消息,因此不需要路由订阅消息,而每个传输仍需要路由信息来发送命令。

如您所见,V5和V6之间的语法只有差异,概念应该没有变化。既然你声称上面的例子适合你,我只能想象为什么会这样的原因:

  • 您的逻辑端点共享相同的订阅存储,这可能导致发送到订阅者端点的订阅消息意外地对发布者可见。
  • 发布者使用的持久订阅存储已包含订阅者的订阅。虽然它可能不再接收订阅消息(因为您的配置不应该),但它仍然有一个由发布者使用的“旧”订阅。

无论其中一个原因是否可以解释您所看到的行为,当使用NServiceBus进行MSMQ传输时,订阅者始终需要为发布者配置路由,以便订阅消息到达发布者。这种设计在V5和V6之间没有变化。

有一个很好的示例演示了特定文档中可用的V5和V6中的发布/订阅:https://docs.particular.net/samples/pubsub/?version=core_5

  

我已更新到NServiceBus 6,其中IProvideConfiguration及其MessageEndpointMappings已过时。

请注意,在V6中,这两个API都已被废弃并带有警告,但它们仍然可以继续工作。这些API将在下一个主要版本中删除。

我希望这可以解决一些问题。