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

In NServiceBus 6, can an endpoint subscribe to an event without knowing the publishing endpoint?

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

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

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

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

现在: 这消失了,我有以下内容。这完全取代了 IProvideConfiguration class:

的需要
    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 中,这不是必需的。

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

回答你的问题:

So what do I do if the event is published by several endpoints?

您可以通过订阅者多次 RegisterPublisher 调用来订阅来自多个发布者的同一事件。

请注意,如果同一事件从多个逻辑端点发布,通常会被视为异味。您可能需要考虑为每个逻辑端点使用不同的事件类型,或者可能从事件切换到命令。如果您不确定消息设计,强烈建议访问 Particular Software Google Group,人们很乐意帮助您解决扩展此 SO 问题的设计问题。

关于V5和V6的变化:

In NSB5 I a subscriber would subscribe as I have shown above, by using its own endpoint name in the MessageEndpointMapping, and not the publisher's endpoint name.

我很难理解这个声明。 V5 和 V6 使用相同的订阅方法,只是语法不同。

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

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

如您所见,V5和V6只是语法上的区别,概念上应该没有什么变化。既然你声称上面的例子对你有用,我只能想象几个原因:

  • 您的逻辑端点共享相同的订阅存储,这可能会导致发送到订阅者端点的订阅消息意外地被发布者看到。
  • 发布者使用的永久订阅存储已经包含来自订阅者的订阅。尽管它可能不再接收订阅消息(因为根据您的配置它不应该接收)它仍然有一个 "old" 订阅供发布者使用。

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

在特定文档中有一个很好的示例演示了 V5 和 V6 中的 Publish/Subscribe:https://docs.particular.net/samples/pubsub/?version=core_5

I have updated to NServiceBus 6, where the IProvideConfiguration and its MessageEndpointMappings are obsolete.

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

我希望这能让事情更清楚一些。