【问题标题】:How do I separate out SQS queues for different environments in Mass Transit?如何在 Mass Transit 中为不同环境分离 SQS 队列?
【发布时间】:2020-09-30 18:55:48
【问题描述】:

我已将公共交通指向我的 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 订阅就越多。最重要的是,如果我启动一个配置为“开发”的消费应用程序,它将开始消费所有不同范围的所有消息。因此,我没有得到任何环境分离。

是否有这些不同的主题提供不同的队列?有没有办法在我的主题旁边整齐地为我的队列添加前缀?

其实,“Scope”配置如果只是把topic分出来,然后都去同一个队列乱处理,那还有什么意义呢?

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

【问题讨论】:

    标签: amazon-sqs masstransit


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 非常感谢。我非常感谢您花时间回答这个标签上的问题。我试试看!
    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 2022-11-11
    • 1970-01-01
    • 2015-08-01
    • 2018-06-03
    相关资源
    最近更新 更多