如何配置MassTransit对接现有AWS SNS/SQS实现消息收发
配置占位符取值说明
cfg.ReceiveEndpoint(">> What goes here? <<", e =>:填入你现有SQS的名称,即示例中的SQS,该参数为MassTransit要监听的SQS队列名e.Subscribe(">> What goes here? <<", s =>:填入你要订阅的SNS主题名称,即示例中的SNS,对应你AWS控制台已创建的SNS主题名s.TopicAttributes["DisplayName"] = ">> What goes here? <<":填入SNS主题的展示名,即示例中的SNS.DisplayName,如果你不需要修改已有SNS主题的属性,该配置行可以直接删除,避免因为无修改权限导致启动报错。
可选配置说明
注释掉的TopicSubscriptionAttributes仅在需要配置订阅特殊属性时使用,比如死信队列策略、消息过滤规则等,无特殊需求不需要填写,保持注释即可。
完整可运行配置示例
.AddMassTransit(x => { x.AddConsumer<MyConsumer>(); x.UsingAmazonSqs((context, cfg) => { // 当你定义的C#消息类名和SNS主题名不一致时,加这个映射,发布时就会自动发到对应SNS cfg.Message<你要发布的消息类>(m => m.SetEntityName("SNS")); cfg.Host("us-west-2", h => { h.AccessKey("access"); h.SecretKey("secret"); }); cfg.ReceiveEndpoint("SQS", e => { e.UseMessageRetry(r => r .Interval(2, TimeSpan.FromMilliseconds(5000)) ); // 禁止MassTransit自动创建/修改队列/主题,适配已有的AWS资源 e.ConfigureConsumeTopology = false; // 如果你的SQS是FIFO队列,需要额外加下面这行配置 // e.IsFifo = true; e.Subscribe("SNS", s => { // 无修改SNS属性需求直接删掉下面这行即可 // s.TopicAttributes["DisplayName"] = "SNS.DisplayName"; }); e.ConfigureConsumer<MyConsumer>(context); }); }); }) .AddMassTransitHostedService()
遗漏配置&常见报错排查
你遇到的Endpoint faulted报错90%是权限或者配置不匹配导致,按以下项检查:
- 确认AK/SK对应的IAM账号有对应SQS的
sqs:GetQueueUrl、sqs:ReceiveMessage、sqs:DeleteMessage、sqs:SendMessage权限,以及对应SNS的sns:Subscribe、sns:Publish权限,不需要给创建/删除资源的权限 - 确认SQS和SNS在同一AWS区域,和Host配置的
us-west-2一致 - 如果你保留了TopicAttributes/TopicSubscriptionAttributes配置,确认IAM账号有对应资源的修改权限,否则直接删除这两类配置即可
- 收发消息逻辑匹配:从SQS收消息直接用
MyConsumer消费对应类型即可;发布到SNS调用IPublishEndpoint.Publish(消息实例)即可,不需要手动拼接资源地址
内容的提问来源于stack exchange,提问作者JALLRED
相关产品推荐
相关产品推荐

