asp.net-core - Mass Transit + Azure Service Bus:使用某些类型的消息而不创建相应的主题
问题描述
正如我已经能够验证的那样,在使用 Azure 服务总线的 MassTransit 中,“消费者”使用的每种类型的对象都会为该类型生成一个主题,而不管它是否仅在特定的“接收端点”(队列)中使用。当使用“Send()”方法发送这种类型的消息时,消息直接发送到“接收端点”(队列)而不经过主题。如果使用“Publish()”方法发布相同的消息,则将其发布在 Topic 中,并从相应的订阅者转发到接收端点(队列)。
我的应用程序使用 CQRS 模式,其中消息分为命令和事件。命令使用发送-接收模式,因此在 MassTransit 中始终使用“Send()”方法进行调度。然而,这些事件基于发布-订阅模式,因此总是在 MassTransit 中使用“Publish()”方法进行调度。结果,在总线上创建了大量从未使用过的主题(每种类型的命令一个),因为属于这些主题的消息直接发送到接收者的队列。
出于所有这些原因,我要问的问题是,是否可以配置 MassTransit,使其不会自动创建某些类型消息的主题,因为它们只会使用“Send()”方法发送?这在 MassTransit 中是否有意义,还是不可能/不推荐?谢谢!
问候
2021 年 16 月 4 日已编辑
在进行了一些测试之后,我编辑了这个主题以澄清其目的是配置 MassTransit 以便它不会自动创建某些类型的消费消息的主题,所有这些消息都在同一个接收端点上接收. 也就是说,目的是配置(如果可能,动态地通过对象的类型)消费的消息类型创建一个主题,哪些不在同一个接收端点中。假设我们有一个与服务关联的接收端点(队列),并且该服务能够消费命令和事件,因为命令仅通过 Send() 分派,因此无需为它们创建主题,但是通过 Publish() 调度的事件,它们需要它们的主题(和它们的订阅者)存在才能传递消息并被使用。
提前致谢
解决方案
是的,对于托管仅接收已发送消息的消费者的接收端点,您可以ConfigureConsumeTopology = false
为该接收端点指定。您可以通过ConsumerDefinition
, 或直接配置接收端点来执行此操作。
更新
也可以使用消息契约上的属性禁用每个消息类型的拓扑配置:
[ConfigureConsumeTopology(false)]
public interface SomeCommand
{
}
这将阻止创建主题/交换并将其绑定到接收端点。
虽然我可以理解“纯粹的 CQRS 口头禅”并且只发送命令的愿望,但我建议您阅读这个答案并考虑到它,然后再让您的开发人员负担过重,知道系统中的每个端点的名称......
推荐阅读
- html - VS Code:使用“Live Server”打开时未预览 SVG
- c++ - 抛出析构函数导致内存泄漏
- sql - 如何在 BigQuery 中将多个列的空值替换为 0?
- database - Ktor 如何使用查询参数过滤掉数据
- javascript - 承诺等待抛出“RangeError:超出最大调用堆栈大小”
- java - 我正在努力将我的数据类连接到我的其余代码。它在我的代码中导致未解决的引用
- java - 在 Spark 中过滤和审计中间计数
- java - 如何检查 CSRF 安全性是否处于活动状态?
- json - 从在线 HTTP 获取 Flutter 中的查询
- dialogflow-cx - DialogFlow CX webhook 基础知识