如何在大众运输的不同环境中分离SQS队列?

问题描述

我已将大众运输指向我的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

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

总有这些不同的主题供不同的队列使用吗?无论如何,是否可以在主题旁边加上整齐的前缀?

实际上,如果“范围”配置仅将主题分开,然后将它们全部放入同一队列以进行不加区别的处理,那又有什么意义呢?

NB。我认为这里的解决方案不是仅使用单独的订阅。这是相当大的开销,我觉得“范围”应该可以正常工作。

解决方法

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

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

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

那应该给你你想要的。 您仍然需要像已经指定的那样指定范围,该范围将应用于SNS主题名称。

SQS对MassTransit的支持由来已久,并且团队讨厌重大更改。这就是为什么这些不是新默认值的原因,因为它们会破坏现有应用程序。