如何解决如何在 MassTransit 中不使用 SNS 主题正确配置 SQS?
我在使用 SQS 配置 MassTransit 时遇到了一些问题。我的目标是让 N 个消费者创建 N 个队列,并且每个消费者都接受不同的消息类型。因为我总是有一个 1 对 1 的消费者到消息映射,所以我对任何类型的扇出行为不感兴趣。因此,发布类型为 T 的消息应将其直接发布到该队列。我将如何配置它?这是我目前所拥有的:
services.AddMassTransit(x =>
{
x.AddConsumers(Assembly.GetEntryAssembly());
x.UsingAmazonSqs((context,cfg) =>
{
cfg.Host("aws",h =>
{
h.AccessKey(mtSettings.AccessKey);
h.SecretKey(mtSettings.SecretKey);
h.Scope($"{mtSettings.Environment}",true);
var sqsConfig = new AmazonSQSConfig() { RegionEndpoint = RegionEndpoint.GetBySystemName(mtSettings.Region) };
h.Config(sqsConfig);
var snsConfig = new AmazonSimpleNotificationServiceConfig()
{ RegionEndpoint = RegionEndpoint.GetBySystemName(mtSettings.Region) };
h.Config(snsConfig);
});
cfg.ConfigureEndpoints(context,new BusEnvironmentNameFormatter(mtSettings.Environment));
});
});
BusEnvironmentNameFormatter
类覆盖 KebabCaseEndpointNameFormatter
并添加环境作为前缀,效果是所有队列都以 'dev' 开头,而 h.Scope($"{mtSettings.Environment}",true)
行对主题。
我试图在不配置主题的情况下使其正常工作,但我无法在没有任何错误的情况下使其正常工作。我错过了什么?
SQS 文档有点单薄,但实际上可以在不使用 sns 主题的情况下执行 bus.Publish()
还是有必要?如果不可能,我将如何使用 bus.Send()
而没有在调用中硬编码队列名称?
干杯!
解决方法
Publish
需要使用主题,在 SQS 的情况下使用 SNS。
如果您想自己配置端点并阻止使用主题,您需要:
- 设置
ConfigureConsumeTopology = false
– 这会阻止创建主题并将其连接到接收端点队列。 - 设置
PublishFaults = false
- 这可以防止在消费者抛出异常时创建故障主题。 - 不要调用
Publish
,因为显然这会创建一个主题。
如果你想以某种方式为你的接收端点名称建立一个与你发送消息的能力一致的约定,你可以创建你自己的端点名称格式化程序,它会使用消息类型,然后使用相同的使用 GetSendEndpoint
短名称语法调用 queue:name
以发送消息直接到这些队列的名称。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。