如何在 MassTransit 中为订阅和队列设置默认命名约定?

How do I set a default naming convention for subscriptions and queues in MassTransit?

目前我们绑定到本地和测试环境的单个 Azure 服务总线实例(我更喜欢不同的设置,但这不取决于我)。以前我们使用的是一个自定义框架,它为每个主题创建一个订阅,其名称是服务名称的混合,如果该项目是 运行 开发人员在他的机器上,它会附加一个“本地名称" 以避免让所有开发本地计算机和服务器实例竞争相同的消息。因此,例如,对于 ShoppingService,它为服务器实例创建了一个名为 ShoppingService 的订阅,而在 Joe 的本地计算机中,它创建了一个名为 ShoppingService-JoeComputer 的订阅。现在我们正试图从这个自定义框架切换到 MassTransit,因为我们喜欢它提供的附加功能(也因为老实说,自定义框架的错误比我们愿意承认的要多)。我们按照 Patterson 发布的这段视频来创建命令、事件和消费者,一切都按照描述的方式工作:

MassTransit - Using Azure Service Bus

但是,我们现在面临着我之前提到的竞争问题。为了解决这个问题,我们将尝试设置我们当前使用的自定义命名约定,所以我的问题是:

  1. 有没有办法修改 MassTransit 使用的默认命名约定?我们希望将它的大部分保留在它根据命令类型名称创建主题的位置,但我们希望为转发订阅和队列添加一个后缀。换句话说,如果我们讨论视频中描述的提交订单命令,我们希望订阅名称为“submit-order-joe”,队列名称为“submit-order-joe”,如果 运行 在乔的机器上。我们可以为每个 consumer/client/publisher 手动设置配置,但如果我们可以“全局”设置它会很棒。

  2. 使用默认约定,如果有两个名为“namespaceOne.SubmitOrder”和“namespaceTwo.SubmitOrder”的命令会怎样?根据我们所看到的,它将创建两个不同的主题,但两个订阅都将称为“提交订单”,并且都将消息转发到称为“提交订单”的同一队列。那会让人感到困惑,我什至不知道 MassTransit 是否会正确使用这些命令。

MassTransit 中有两种命名约定。实体名称(基于消息类型,将成为 Azure 服务总线中的主题)和端点名称(基于消费者、saga 或 activity 类型,将成为 ASB 中的队列)。

您可以指定自己的 entity name formatter 来自定义实体名称格式,或者您可以覆盖特定消息。

您还可以指定自己的 endpoint name formatter, described in this video 来自定义为接收端点生成的队列名称。或者您可以创建内置格式化程序的实例,指定不同的构造函数参数以包含前缀、包含命名空间等。