如何在 Mass Transit 中为不同的环境分离出 SQS 队列?

How do I separate out SQS queues for different environments in Mass Transit?

我已将 mass transit 指向我的 AWS 账户并为其指定一个“范围”。这会为每个范围创建一个 SNS 主题。这是我的配置,范围设置为“开发”:

container.AddMassTransit(config =>    
  config.AddConsumer<FooConsumer>(typeof(FooConsumerDefinition));

  config.UsingAmazonSqs((amazonContext, amazonConfig) =>
   {
      amazonConfig.Host(
       new UriBuilder("amazonsqs://host")
        {
            Host = "eu-north-1"
        }.Uri, h =>
        {
          h.AccessKey("my-access-key-is-very-secret");
          h.SecretKey("my-secret-key-also-secret");
          h.Scope("development", true);
        });

        amazonConfig.ConfigureEndpoints(amazonContext);
  });
);

// Somewhere else:
public class FooConsumerDefinition : ConsumerDefinition<FooConsumer>
{
    public FooConsumerDefinition ()
    {
        ConcurrentMessageLimit = 1;
        // I used to set EndpointName, but I stopped doing that to test scopes
    }
}

如果我更改范围并再次 运行,我将获得更多 SNS 主题和订阅,它们以我的范围为前缀。类似于:

development_Namespace_ObjectThatFooRecieves

但是,SQS 队列没有前缀,数量也不会增加。

Foo

您 运行 的范围越多,SNS 订阅 'Foo' 就会越多。最重要的是,如果我启动一个配置为“开发”的消费应用程序,它将开始消费所有不同范围的所有消息。因此,我没有得到任何环境分离。

有没有办法让这些不同的话题进入不同的队列?有没有办法在我的主题旁边巧妙地为我的队列添加前缀?

事实上,“Scope”配置如果只是将主题分开,然后它们都进入同一个队列进行任意处理,那还有什么意义呢?

注意。我不认为这里的解决方案是只使用单独的订阅。这是很大的开销,我觉得“Scope”应该可以正常工作。

MassTransit 7.0.4 在端点名称格式化程序上引入了新选项,包括包含命名空间的选项,以及在队列名称前面添加前缀的选项。这应该可以满足您的大部分要求。

在上面的示例中,您可以使用:

services.AddSingleton<IEndpointNameFormatter>(provider => 
    new DefaultEndpointNameFormatter("development", true));

这应该能满足您的需求。 您仍然需要像之前那样指定范围,这将应用于 SNS 主题名称。

SQS support for MassTransit has a long history, and teams hate breaking changes. That is why these aren't the new defaults as they'd break existing applications.