问题描述
我已将大众运输指向我的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
Foo
您运行的范围越多,将获得更多的“ Foo” SNS订阅。最重要的是,如果我启动一个配置为“开发”的使用应用程序,它将开始使用所有不同作用域的所有消息。因此,我没有任何环境隔离。
总有这些不同的主题供不同的队列使用吗?无论如何,是否可以在主题旁边加上整齐的前缀?
实际上,如果“范围”配置仅将主题分开,然后将它们全部放入同一队列以进行不加区别的处理,那又有什么意义呢?
NB。我认为这里的解决方案不是仅使用单独的订阅。这是相当大的开销,我觉得“范围”应该可以正常工作。
解决方法
MassTransit 7.0.4在端点名称格式器上引入了新选项,包括用于包含名称空间的选项,以及在队列名称前面添加前缀的选项。这应该可以满足您的大部分要求。
在上面的示例中,您可以使用:
services.AddSingleton<IEndpointNameFormatter>(provider =>
new DefaultEndpointNameFormatter("development",true));
那应该给你你想要的。 您仍然需要像已经指定的那样指定范围,该范围将应用于SNS主题名称。
SQS对MassTransit的支持由来已久,并且团队讨厌重大更改。这就是为什么这些不是新默认值的原因,因为它们会破坏现有应用程序。