实战案例 | Amazon SNS 消息通知服务应用实战


  项目需求

在某电商平台的订单处理系统中,当用户提交订单后,系统需实时通知库存管理模块进行库存预留,同时向用户手机发送确认短信。若库存预留失败(如商品缺货),需再次通知用户并记录日志。为满足该场景的实时性、可靠性与多接收端(系统模块 + 用户终端)需求,需选择一种能同时支持 API 调用、短信发送且具备高可用性的消息推送服务。传统自建通知系统成本高且维护复杂,而 Amazon SNS(Simple Notification Service)作为 AWS 托管的发布/订阅消息服务,可一键实现多协议消息分发(如 HTTP/HTTPS、SMS、Email),完美契合需求。

  解决方案

采用 SNS 主题(Topic)作为消息中枢,构建“订单事件驱动”的通知架构。
创建 SNS 主题:如 OrderEventsTopic,作为订单状态变更的消息通道。
订阅多端点:
库存管理模块订阅 HTTP/HTTPS 端点,接收 JSON 格式的订单数据。
用户手机号订阅 SMS 端点,接收格式化短信(如“您的订单#123 已确认”)。
集成 Lambda 处理失败通知:若库存预留失败,触发 Lambda 函数向同一主题发送“失败消息”,SNS 自动推送至用户手机(如“订单#123 预留失败,请联系客服”)。
启用消息过滤:通过订阅属性设置(如 tock-status = [success|fail]),确保用户仅接收与其订单相关的通知,避免信息过载。

  作业步骤

步骤一:创建 SNS 主题
登录 AWS 控制台,进入 SNS 服务,点击“创建主题”,命名(如 OrderEvents)并记录 ARN。
步骤二:配置订阅
为库存管理模块创建 HTTP 订阅:输入 API 网关端点 URL,确认订阅后保存确认令牌(用于服务端验证)。
为用户手机创建 SMS 订阅:输入国际格式手机号(如 +8613800000000),接收验证短信完成订阅。
步骤三:发布测试消息
在 SNS 主题的“发布消息”页面,输入 JSON 消息(如{"order_id": "123", "status": "success"}),选择“发布”。
步骤四:集成 Lambda(可选)
创建 Lambda 函数,绑定 SNS 主题作为触发器,编写逻辑:若检测到 tatus=fail,调用 SNS API 向主题发送失败通知消息。

  结果验证

消息到达率
库存管理模块的 HTTP 端点成功接收 JSON 消息,日志显示请求来源为 ns.amazonaws.com,验证消息签名通过。
用户手机在 10 秒内收到 SMS 通知,内容与发布消息中的 tatu 字段动态匹配(如“订单 123 确认”或“预留失败”)。

容错性测试
模拟库存预留失败,触发 Lambda 函数向 SNS 发送失败消息,用户手机二次接收通知,验证多消息场景下的订阅逻辑正确性。

成本与性能
通过 CloudWatch 监控 SNS 的 PublishSize 和 NumberOfMessagesPublished 指标,确认高并发下无延迟(平均推送时间<1 秒)。
计费报告显示仅按发布消息数(约 0.5/100 万次)和 SMS 条数(依区域定价,如 0.0064/ 条)收费,成本显著低于自建通知系统。