在 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 将在下一个主要版本中删除。
我希望这能让事情更清楚一些。
我已更新到 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 将在下一个主要版本中删除。
我希望这能让事情更清楚一些。