如何在 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.
我已将 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.