在某电商平台的订单处理系统中,当用户提交订单后,系统需实时通知库存管理模块进行库存预留,同时向用户手机发送确认短信。若库存预留失败(如商品缺货),需再次通知用户并记录日志。为满足该场景的实时性、可靠性与多接收端(系统模块 + 用户终端)需求,需选择一种能同时支持 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/ 条)收费,成本显著低于自建通知系统。