Mass Transit + Azure 服务总线:在不创建相应主题的情况下使用某些类型的消息
Mass Transit + Azure Service Bus: Consume some types of messages without creating their corresponding topic
正如我已经能够验证的那样,在带有 Azure 服务总线的 MassTransit 中,“消费者”使用的每种类型的对象都会为该类型生成一个主题,无论它是否仅在特定的“接收端点”中使用(队列)。当使用“Send()”方法发送这种类型的消息时,消息直接发送到“接收端点”(队列)而不经过主题。如果使用“Publish()”方法发布相同的消息,它会发布在主题中,并从相应的订阅者转发到接收端点(队列)。
我的应用程序使用 CQRS 模式,其中消息分为命令和事件。命令使用发送-接收模式,因此总是使用“Send()”方法在 MassTransit 中发送。但是,这些事件基于发布-订阅模式,因此始终使用“Publish()”方法在 MassTransit 中进行调度。结果,在总线上创建了大量从未使用过的主题(每种命令一个),因为属于这些主题的消息被直接发送到接收者的队列。
出于所有这些原因,我要问的问题是 是否可以配置 MassTransit,使其不会自动创建某些类型的消费消息的主题,因为它们会只能使用“Send()”方法发送?这在 MassTransit 中是否有意义,或者不是 possible/recommended?
谢谢!
此致
2021 年 4 月 16 日编辑
在做了一些测试之后,我编辑了这个主题以阐明其目的是配置 MassTransit,以便 它不会自动创建某些类型的消费消息的主题,所有这些消息都在相同的接收端点。也就是说,目的是配置(如果可能,通过对象类型动态配置)哪些类型的消息被消费创建一个主题,哪些不在同一个接收端点。假设我们有一个与服务关联的接收端点(队列),并且该服务能够使用命令和事件,因为命令仅通过 Send() 发送,因此没有必要为它们创建主题,但是通过 Publish() 调度的事件,它们需要它们的主题(和它们的订阅者)存在才能传递消息并被消费。
提前致谢
是的,对于托管仅接收 Sent 消息的消费者的接收端点,您可以为该接收端点指定 ConfigureConsumeTopology = false
。您可以通过 ConsumerDefinition
或在直接配置接收端点时执行此操作。
更新
也可以使用消息协定上的属性禁用每个消息类型的拓扑配置:
[ConfigureConsumeTopology(false)]
public interface SomeCommand
{
}
这将阻止 topic/exchange 创建并绑定到接收端点。
虽然我可以理解“完全遵循 CQRS 咒语”并且只发送命令的愿望,但我建议您 并在让您的开发人员因了解每个端点而负担过重之前考虑到这一点系统名称...
正如我已经能够验证的那样,在带有 Azure 服务总线的 MassTransit 中,“消费者”使用的每种类型的对象都会为该类型生成一个主题,无论它是否仅在特定的“接收端点”中使用(队列)。当使用“Send()”方法发送这种类型的消息时,消息直接发送到“接收端点”(队列)而不经过主题。如果使用“Publish()”方法发布相同的消息,它会发布在主题中,并从相应的订阅者转发到接收端点(队列)。
我的应用程序使用 CQRS 模式,其中消息分为命令和事件。命令使用发送-接收模式,因此总是使用“Send()”方法在 MassTransit 中发送。但是,这些事件基于发布-订阅模式,因此始终使用“Publish()”方法在 MassTransit 中进行调度。结果,在总线上创建了大量从未使用过的主题(每种命令一个),因为属于这些主题的消息被直接发送到接收者的队列。
出于所有这些原因,我要问的问题是 是否可以配置 MassTransit,使其不会自动创建某些类型的消费消息的主题,因为它们会只能使用“Send()”方法发送?这在 MassTransit 中是否有意义,或者不是 possible/recommended? 谢谢!
此致
2021 年 4 月 16 日编辑
在做了一些测试之后,我编辑了这个主题以阐明其目的是配置 MassTransit,以便 它不会自动创建某些类型的消费消息的主题,所有这些消息都在相同的接收端点。也就是说,目的是配置(如果可能,通过对象类型动态配置)哪些类型的消息被消费创建一个主题,哪些不在同一个接收端点。假设我们有一个与服务关联的接收端点(队列),并且该服务能够使用命令和事件,因为命令仅通过 Send() 发送,因此没有必要为它们创建主题,但是通过 Publish() 调度的事件,它们需要它们的主题(和它们的订阅者)存在才能传递消息并被消费。
提前致谢
是的,对于托管仅接收 Sent 消息的消费者的接收端点,您可以为该接收端点指定 ConfigureConsumeTopology = false
。您可以通过 ConsumerDefinition
或在直接配置接收端点时执行此操作。
更新
也可以使用消息协定上的属性禁用每个消息类型的拓扑配置:
[ConfigureConsumeTopology(false)]
public interface SomeCommand
{
}
这将阻止 topic/exchange 创建并绑定到接收端点。
虽然我可以理解“完全遵循 CQRS 咒语”并且只发送命令的愿望,但我建议您