NServiceBus 端点名称如何与 pub/sub 一起使用

How do NServiceBus endpoint names work with pub/sub

我今天一整天都在与 NServiceBus 解决同样非常简单的问题。问题是有很多关于如何更改配置的文档,但几乎没有任何内容可以帮助我了解我需要什么配置。

有示例应用程序,它们可以工作,但没有解释它们的工作原理、它们有什么限制,或者如何做一些与示例略有不同的事情。示例应用程序还提供了一种 "Hello world" 类型的简单性,在任何实际应用程序中,您需要与示例应用程序不同的东西,但同样没有关于如何进行这些更改或配置选择的影响的帮助。

从所有很难从文档中猜测的事情来看,端点名称、UnicastBusConfig 映射和 pub/sub 持久性之间的关系是目前最令人沮丧的。

终结点名称是MSMQ 队列的名称吗?这是否意味着每个应用程序对于所有消息类型都只有一个输入队列?在 UnicastBusConfig 中添加映射会导致向发布者发送订阅消息,还是会在订阅数据库中添加订阅记录?为什么不能多次向 UnicastBusConfig 添加相同的消息类型?为什么我不能只订阅某种类型的消息而不必知道它们来自哪个服务器?

对于理解 NServiceBus 的人来说,这可能看起来太简单了,不值得记录,但对于第一次接触这个的人来说,这是最难从低层的泥沼中推断出来的非常简单的东西关卡细节。

您可能想查看 http://docs.particular.net/nservicebus/ 上的 NServiceBus 文档,它非常全面,应该可以回答您的大部分问题。

Is the endpoint name the name of the MSMQ queue?

是的。

Does that mean that every application has only one input queue for all message types?

是的。每个端点都有一个与之关联的队列,因此该端点的所有消息都通过同一个队列。

Does adding a mapping in UnicastBusConfig cause a subscription message to be sent to the publisher, or does it add a subscription record in subscription DB?

也不是。 UnicastBusConfig 部分用于设置类型(或程序集)和端点之间的关系。所以它实际上并没有导致设置订阅(本身),但它告诉框架消息将来自哪里(因此 如何 订阅它们)。

实际订阅在系统启动时创建,NSB 找到与 UnicastBusConfig 中的部分匹配的特定类型消息的处理程序(假设自动订阅已打开)。

这也适用于发送命令——配置部分让框架知道向哪个端点发送命令。

Why can't you add the same message type more than once to UnicastBusConfig?

因为一个命令只能有一个(逻辑)端点来处理它,而一个事件只能有一个(逻辑)端点来发布它。

Why can't I just subscribe to messages of a certain type without having to know which server they come from?

这个问题有点难以明确回答,因为它涉及拥有中央代理(中心辐射型)与总线式架构的哲学。

但简而言之,某些地方需要知道如何找到发布者才能订阅它。因为 NServiceBus 没有中央代理或路由 table,它留给客户端根据它使用的端点的知识进行配置。