【问题标题】:How do I set a default naming convention for subscriptions and queues in MassTransit?如何为 MassTransit 中的订阅和队列设置默认命名约定?
【发布时间】:2021-11-03 17:56:48
【问题描述】:

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

MassTransit - Using Azure Service Bus

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

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

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

【问题讨论】:

  • 你好,你能把代码贴出来让我们帮忙吗?

标签: c# .net azure azureservicebus masstransit


【解决方案1】:

MassTransit 中有两种命名约定。实体名称(基于消息类型,将是 Azure 服务总线中的主题)和终结点名称(基于使用者、saga 或活动类型,将是 ASB 中的队列)。

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

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

【讨论】:

  • 非常感谢@chris-pattherson,这正是我要找的。关于使用请求/响应模式时创建的订阅,我只有一个问题。队列有预期的名称,但订阅的末尾有一些奇怪的字符:Image here
  • 如果名称超过字符限制,它将截断它并附加一个散列值以保持它的唯一性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
相关资源
最近更新 更多