MassTransit 8.0连接预创建AWS SNS/SQS资源异常排查
MassTransit 8.0对接预创建SQS/SNS资源启动失败排查
背景
- 业务正在从AWS原生SDK迁移至MassTransit 8.0正式版,对接SQS/SNS服务时出现连接异常
- 基础设施管控规则:SQS队列、SNS主题全部由基础设施团队通过Terraform统一预创建,应用程序及开发人员无任何资源修改权限,仅可读写已存在的资源
- 预创建资源详情:
- SQS队列:名称为
bci-name-dev-aim-name,加密方式为SSE-SQS,已预先配置好SNS订阅关系,通过SQS协议订阅对应业务主题 - SNS主题:名称为
bci-name-dev-aim-name-topic,使用AWS默认加密配置,密钥ID为alias/aws/sns
- SQS队列:名称为
初始配置
生产者配置
services.AddMassTransit(cfg => { cfg.UsingAmazonSqs((context, bus) => { bus.UseMessageScheduler(schedulerEndpoint); // 从环境变量加载AWS认证信息 bus.Host("us-west-2", h => {}); bus.Message<PublicationMessage>(x => { x.SetEntityName("bci-name-dev-aim-name-topic"); }); bus.ConfigureEndpoints(context); }); });
消费者配置
services.AddMassTransit(cfg => { cfg.AddConsumer<PublicationMessageConsumer>(); cfg.UsingAmazonSqs((context, bus) => { bus.Host("us-west-2", h => {}); // 手动配置SNS主题KMS密钥属性 bus.PublishTopology.TopicAttributes.Add(QueueAttributeName.KmsMasterKeyId, "alias/aws/sns"); bus.ReceiveEndpoint("bci-name-dev-aim-name", ec => { // 关闭默认消费拓扑自动配置 ec.ConfigureConsumeTopology = false; // 手动配置SQS队列KMS密钥属性 ec.QueueAttributes.Add(QueueAttributeName.KmsMasterKeyId, "alias/aws/sqs"); // 手动订阅SNS主题 ec.Subscribe("bci-name-dev-aim-name-topic"); ec.ConfigureConsumer<PublicationMessageConsumer>(context); }); bus.ConfigureEndpoints(context); }); });
异常表现
- 生产者启动正常,日志输出总线启动成功记录:
info: MassTransit[0] Bus started: amazonsqs://us-west-2/
- 消费者启动流程卡住,无总线启动成功日志,仅输出端点配置完成记录:
info: MassTransit[0] Configured endpoint bci-name-dev-aim-name, Consumer: Consumer.PublicationMessageConsumer
- 手动终止消费者进程时输出警告日志,提示总线未启动,停止操作失败:
warn: MassTransit[0] Failed to stop bus: amazonsqs://us-west-2/BKOWALCZYKW1_Consumer_bus_kotoyynbyybfbeanbdpf9sykno?durable=false&autodelete=true (Not Started)
修复方案
故障原因:MassTransit的Amazon SQS传输默认会在启动阶段执行拓扑对齐操作,即按照代码中声明的队列属性、主题属性、订阅关系调用AWS API创建或更新对应资源。由于当前应用账号无资源修改权限,拓扑对齐操作触发权限校验失败,直接中断总线启动流程,且未输出显式的权限错误日志。
修复时移除消费者配置中所有会触发资源修改的逻辑:包括手动设置主题/队列KMS属性、手动调用Subscribe方法绑定主题的代码,生产者配置无需调整。
修复后的消费者配置如下:
services.AddMassTransit(cfg => { cfg.AddConsumer<PublicationMessageConsumer>(); cfg.UsingAmazonSqs((context, bus) => { bus.Host("us-west-2", h => {}); bus.ReceiveEndpoint("bci-name-dev-aim-name", ec => { // 关闭默认消费拓扑自动配置,避免触发资源创建/修改操作 ec.ConfigureConsumeTopology = false; ec.ConfigureConsumer<PublicationMessageConsumer>(context); }); bus.ConfigureEndpoints(context); }); });
调整配置后重启消费者,可正常输出总线启动成功日志Bus started: amazonsqs://us-west-2/,服务连接、消息生产与消费能力全部恢复正常。
内容的提问来源于stack exchange,提问作者Bartosz Kowalczyk
相关产品推荐
相关产品推荐

