后端与接口
用 AWS SDK for Java 2.x 实现…
在 Java 应用中用 AWS SDK 2.x 搭建 SQS 队列与 SNS 主题,实现消息发送、长轮询接收、FIFO、死信队列与 Spring Boot 集成。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 AWS SDK for Java 2特定
解决思路
- 引入依赖:在 pom.xml 中添加 software.amazon.awssdk:sqs 与 software.amazon.awssdk:sns。
- 配置客户端:用 SqsClient.builder() 和 SnsClient.builder() 指定 region(如 Region.US_EAST_1),SQS 客户端可加 DefaultCredentialsProvider.create()。
- 创建队列并发送消息:调用 createQueue(CreateQueueRequest.builder().queueName("my-queue").build()) 获取 queueUrl,再用 sendMessage(SendMessageRequest.builder().queueUrl(queueUrl).messageBody("Hello, SQS!").build()) 发送并取回 messageId。
- 接收并删除消息:用 receiveMessage 设置 maxNumberOfMessages(10) 与 waitTimeSeconds(20) 做长轮询,遍历 response.messages() 处理 body,处理成功后用 deleteMessage 传入 receiptHandle 删除。
- 创建 FIFO 队列:attributes 设置 QueueAttributeName.FIFO_QUEUE="true" 与 CONTENT_BASED_DEDUPLICATION="true",队列名以 .fifo 结尾;发送时指定 messageGroupId 与 messageDeduplicationId(如 UUID.randomUUID().toString())。
- 创建 SNS 主题并发布:用 createTopic(CreateTopicRequest.builder().name("my-topic").build()) 获取 topicArn,再用 publish(PublishRequest.builder().topicArn(topicArn).subject(...).message(...).build()) 发布。
- 建立 SNS 到 SQS 订阅:先用 getQueueAttributes 取 QUEUE_ARN,再调用 subscribe(SubscribeRequest.builder().protocol("sqs").endpoint(queueArn).topicArn(topicArn).build())。
- Spring Boot 集成:在 @Service 中注入 SnsClient 与 ObjectMapper,用 @Value 读取 topic ARN,publish 时把对象序列化为 JSON 并附带 messageAttributes(如 orderType)。
- 实现消息处理流程:创建队列/主题 → 发送并校验 messageId 非空 → 用 waitTimeSeconds=20 长轮询接收 → 处理前校验 payload → 处理成功后删除并校验删除响应成功 → 定期用 redrivePolicy 检查 DLQ → 用 CloudWatch NumberOfMessagesSent 指标验证投递。
- 加入校验检查:发送后若 messageId 为 null 或空则抛 MessagingException;接收为空时记 debug 日志(长轮询下属正常);删除后若 sdkHttpResponse().isSuccessful() 为 false 则抛异常。
- 配置凭证:通过环境变量 export AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_REGION 设置。
- 监控与调试:查看 CloudWatch 指标 ApproximateNumberOfMessages、NumberOfMessagesSent、NumberOfMessagesReceived;将 software.amazon.awssdk 日志级别设为 DEBUG;用 X-Ray 做分布式追踪。
- SQS 最佳实践:使用 20-40 秒长轮询减少空响应与成本;处理成功后必须删除消息;实现幂等处理应对重复消息;用 redrivePolicy 配置 DLQ;需要顺序时用 FIFO 队列(300 msg/sec 限制)。
- SNS 最佳实践:用 filter policies 减少不必要投递;消息保持在 256KB 以下;实现带指数退避的重试;监控 NumberOfNotificationFailed 指标。
- 通用最佳实践:优先用 IAM 角色而非静态凭证;复用线程安全的客户端;用 LocalStack 或 Testcontainers 做测试。
- 注意约束:SQS 与 SNS 消息最大 256KB;未删除消息在 visibility timeout 后会重新出现;处理前对消息体做输入校验与净化;FIFO 队列名必须以 .fifo 结尾;FIFO 每队列 300 msg/sec;SQS 消息最多保留 14 天;必须配置 DLQ 防止消息丢失;SQS 队列是区域级的,跨区域需借助 SNS。
适用边界 · 注意事项
- 未使用 AWS 云服务或无法访问 SQS/SNS 的场景
- 需要非 AWS 消息中间件(如 Kafka、RabbitMQ)的场景
- 无法配置 AWS 凭证或 IAM 权限的环境