You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在AWS上实现类Azure Service Bus的发布-订阅功能求助

使用AWS原生服务实现类似Azure Service Bus的发布-订阅功能(控制台程序直接消费)

针对你的需求——用AWS原生服务实现控制台程序可直接监听的发布-订阅,无需复杂的MSK、不用HTTP端点接收,SNS + SQS的组合是最优选择:SNS作为消息发布的主题层,每个消费者对应独立的SQS队列,订阅到SNS主题后,控制台程序通过SQS SDK直接拉取消息,完美匹配你每周数百条消息、多消费者的场景。

实现步骤

  1. 创建SNS主题
    在AWS控制台或CLI创建标准SNS主题(标准主题支持多订阅,满足多消费者需求)。

  2. 为每个消费者创建SQS队列
    每个消费者对应一个独立的SQS标准队列,确保消息能被各自的控制台程序独立消费。同时需给队列添加权限,允许SNS主题向队列发送消息,示例权限策略(可在SQS控制台配置):

    {
      "Version": "2008-10-17",
      "Id": "SNS-SQS-Permission",
      "Statement": [
        {
          "Sid": "AllowSNStoSendMessage",
          "Effect": "Allow",
          "Principal": "*",
          "Action": "sqs:SendMessage",
          "Resource": "你的SQS队列ARN",
          "Condition": {
            "ArnEquals": {
              "aws:SourceArn": "你的SNS主题ARN"
            }
          }
        }
      ]
    }
    
  3. 将SQS队列订阅到SNS主题
    在SNS控制台的主题详情页,添加订阅,选择类型为Amazon SQS,指定对应SQS队列的ARN,完成订阅关联。

.NET控制台程序代码示例

发送消息到SNS主题

需引用AWSSDK.SNS NuGet包:

using Amazon.SimpleNotificationService;
using Amazon.SimpleNotificationService.Model;

var snsClient = new AmazonSimpleNotificationServiceClient();
var topicArn = "你的SNS主题ARN";
var message = "测试发布订阅消息";

var request = new PublishRequest
{
    TopicArn = topicArn,
    Message = message
};

var response = await snsClient.PublishAsync(request);
Console.WriteLine($"消息已发送,MessageId: {response.MessageId}");

从SQS队列接收消息

需引用AWSSDK.SQS NuGet包:

using Amazon.SQS;
using Amazon.SQS.Model;

var sqsClient = new AmazonSQSClient();
var queueUrl = "你的SQS队列URL";

// 配置长轮询(等待最多20秒,减少空轮询)
var receiveRequest = new ReceiveMessageRequest
{
    QueueUrl = queueUrl,
    MaxNumberOfMessages = 10,
    WaitTimeSeconds = 20
};

while (true)
{
    var response = await sqsClient.ReceiveMessageAsync(receiveRequest);
    if (response.Messages.Count > 0)
    {
        foreach (var msg in response.Messages)
        {
            Console.WriteLine($"收到消息: {msg.Body}");
            // 处理完消息后删除,避免重复消费
            await sqsClient.DeleteMessageAsync(queueUrl, msg.ReceiptHandle);
        }
    }
    else
    {
        Console.WriteLine("暂无新消息,等待中...");
    }
}

关键注意事项

  • 长轮询配置:开启SQS的长轮询(WaitTimeSeconds设置为1-20秒),可减少空轮询次数,降低API调用开销。
  • 消息持久化:SQS默认将消息保存4天,可根据需求调整保留时长(最长14天)。
  • 消费者隔离:每个消费者使用独立的SQS队列,确保消息不会被其他消费者抢占,满足多消费者需求。

内容的提问来源于stack exchange,提问作者Karthik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:47:30