首页 > 解决方案 > Mass Transit + Azure Service Bus:使用某些类型的消息而不创建相应的主题

问题描述

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

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

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

问候

2021 年 16 月 4 日已编辑

在进行了一些测试之后,我编辑了这个主题以澄清其目的是配置 MassTransit 以便它不会自动创建某些类型的消费消息的主题,所有这些消息都在同一个接收端点上接收. 也就是说,目的是配置(如果可能,动态地通过对象的类型)消费的消息类型创建一个主题,哪些不在同一个接收端点中。假设我们有一个与服务关联的接收端点(队列),并且该服务能够消费命令和事件,因为命令仅通过 Send() 分派,因此无需为它们创建主题,但是通过 Publish() 调度的事件,它们需要它们的主题(和它们的订阅者)存在才能传递消息并被使用。

提前致谢

标签: asp.net-coreazureservicebuspublish-subscribemasstransit

解决方案


是的,对于托管仅接收已发送消息的消费者的接收端点,您可以ConfigureConsumeTopology = false为该接收端点指定。您可以通过ConsumerDefinition, 或直接配置接收端点来执行此操作。

更新

也可以使用消息契约上的属性禁用每个消息类型的拓扑配置:

[ConfigureConsumeTopology(false)]
public interface SomeCommand
{
}

这将阻止创建主题/交换并将其绑定到接收端点。

虽然我可以理解“纯粹的 CQRS 口头禅”并且只发送命令的愿望,但我建议您阅读这个答案并考虑到它,然后再让您的开发人员负担过重,知道系统中的每个端点的名称......


推荐阅读