Asp.net core 公共交通+;Azure服务总线:使用某些类型的消息而不创建相应的主题

Asp.net core 公共交通+;Azure服务总线:使用某些类型的消息而不创建相应的主题,asp.net-core,azureservicebus,publish-subscribe,masstransit,Asp.net Core,Azureservicebus,Publish Subscribe,Masstransit,正如我能够验证的那样,在使用Azure Service Bus的MassTransit中,“消费者”使用的每种类型的对象都会为该类型生成一个主题,而不管它是否仅在特定的“接收端点”(队列)中使用。使用“Send()”方法发送此类型的消息时,该消息将直接发送到“接收端点”(队列),而不必经过主题。如果使用“Publish()”方法发布同一消息,则该消息将在主题中发布,并从相应的订阅服务器转发到接收端点(队列) 我的应用程序使用CQRS模式,其中消息被划分为命令和事件。命令使用发送-接收模式,因此总

正如我能够验证的那样,在使用Azure Service Bus的MassTransit中,“消费者”使用的每种类型的对象都会为该类型生成一个主题,而不管它是否仅在特定的“接收端点”(队列)中使用。使用“Send()”方法发送此类型的消息时,该消息将直接发送到“接收端点”(队列),而不必经过主题。如果使用“Publish()”方法发布同一消息,则该消息将在主题中发布,并从相应的订阅服务器转发到接收端点(队列)

我的应用程序使用CQRS模式,其中消息被划分为命令和事件。命令使用发送-接收模式,因此总是在MassTransit中使用“send()”方法进行调度。但是,事件基于发布-订阅模式,因此总是使用“publish()”方法在MassTransit中进行调度。因此,在总线上创建了大量从未使用过的主题(每种命令类型一个),因为属于这些主题的消息直接发送到接收方队列

出于所有这些原因,我要问的问题是,是否可以配置MassTransit,使其不会自动创建某些类型的已消费邮件的主题,因为它们将仅使用“Send()”方法发送?这在MassTransit中有意义吗?还是不可能/不推荐? 谢谢大家!

问候

2021年4月16日编辑

在做了一些测试之后,我编辑了这个主题,以澄清其意图是配置MassTransit,这样它就不会自动创建某些类型的消息的主题,这些消息都是在同一个接收端点上接收的。也就是说,目的是配置(如果可能的话,通过对象的类型动态地配置)哪些消息类型创建了主题,哪些不在同一接收端点中。假设我们有一个与服务关联的接收端点(队列),该服务能够同时使用命令和事件,因为命令仅通过Send()发送,所以不必为它们创建主题,但是通过Publish()发送的事件需要它们的主题(和他们的订户)为了传递信息而存在并被消费


提前感谢

是,对于承载仅接收已发送消息的使用者的接收终结点,您可以为该接收终结点指定
ConfigureConsumeTopology=false
。您可以通过
ConsumerDefinition
或直接配置接收终结点时执行此操作

更新 还可以使用消息协定上的属性禁用每种消息类型的拓扑配置:

[ConfigureConsumeTopology(false)]
公共接口命令
{
}
这将阻止创建主题/交换并将其绑定到接收端点


虽然我能理解“纯粹遵守CQRS咒语”和只发送命令的愿望,但我建议您在让您的开发人员知道系统中的每个端点的名称之前,先考虑一下这一点。

谢谢@Chris,该解决方案非常有效。我同意您使用“Publish()”的观点更简单更干净,但我正在考虑这个选项,因为它“强制”开发团队必须对其正在做的事情有功能性的了解,必须完全知道他们想要做的是发送命令还是发布事件。因此,如果开发人员试图发布命令,由于其主题不存在,将引发异常,从而强化“将命令发送给特定接收者”的概念(发送-接收模式)”。非常感谢您一如既往的帮助,这是一种荣幸。RegardsHi@Chris,您能检查我在问题中所做的编辑吗?非常感谢!您不能有选择地逐个消费者启用绑定。此外,不鼓励将所有消费者放在单个接收端点上。在我们的应用程序中,队列(接收端点)已定义了每个服务,而不考虑其接收的使用者数量和/或消息类型。根据您之前的评论,这是不鼓励的,那么定义服务的不同接收端点的正确方法是什么?每个使用者一个?通常,我为每个使用者使用单独的接收端点。这就是defa使用
ConfigureEndpoints
时的默认行为。我已经用一些有关配置使用者和消息类型的附加信息更新了答案。