如何在不使用 MassTransit 中的 SNS 主题的情况下正确配置 SQS?

How to properly configure SQS without using SNS topics in MassTransit?

我在使用 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 class 覆盖 KebabCaseEndpointNameFormatter 并添加环境作为前缀,效果是所有队列都以 'dev' 开头,而 h.Scope($"{mtSettings.Environment}", true) 行对主题执行相同的操作。

我试过在完全不配置主题的情况下让它工作,但我无法让它在没有任何错误的情况下工作。我错过了什么?

SQS 文档有点单薄,但实际上可以在不使用 sns 主题的情况下进行 bus.Publish() 还是有必要?如果不可能,我将如何使用 bus.Send() 而无需在调用中对队列名称进行硬编码?

干杯!

Publish 需要使用主题,在 SQS 的情况下使用 SNS。

如果您想自己配置端点并阻止使用主题,您需要:

  1. 设置 ConfigureConsumeTopology = false – 这会阻止创建主题并将其连接到接收端点队列。
  2. 设置 PublishFaults = false – 这可以防止在消费者抛出异常时创建故障主题。
  3. 不要调用 Publish,因为,显然 这会创建一个主题。

如果您想以某种方式为您的接收端点名称建立一个符合您发送消息能力的约定,您可以创建您自己的使用消息类型的端点名称格式化程序然后使用相同的名称调用 GetSendEndpoint,使用 queue:name 短名称语法 消息直接发送到这些队列。