在某電商平臺的訂單處理系統(tǒng)中,當(dāng)用戶提交訂單后,系統(tǒng)需實時通知庫存管理模塊進(jìn)行庫存預(yù)留,同時向用戶手機(jī)發(fā)送確認(rèn)短信。若庫存預(yù)留失敗(如商品缺貨),需再次通知用戶并記錄日志。為滿足該場景的實時性、可靠性與多接收端(系統(tǒng)模塊 + 用戶終端)需求,需選擇一種能同時支持 API 調(diào)用、短信發(fā)送且具備高可用性的消息推送服務(wù)。傳統(tǒng)自建通知系統(tǒng)成本高且維護(hù)復(fù)雜,而 Amazon SNS(Simple Notification Service)作為 AWS 托管的發(fā)布/訂閱消息服務(wù),可一鍵實現(xiàn)多協(xié)議消息分發(fā)(如 HTTP/HTTPS、SMS、Email),完美契合需求。
采用 SNS 主題(Topic)作為消息中樞,構(gòu)建“訂單事件驅(qū)動”的通知架構(gòu)。
創(chuàng)建 SNS 主題:如 OrderEventsTopic,作為訂單狀態(tài)變更的消息通道。
訂閱多端點(diǎn):
庫存管理模塊訂閱 HTTP/HTTPS 端點(diǎn),接收 JSON 格式的訂單數(shù)據(jù)。
用戶手機(jī)號訂閱 SMS 端點(diǎn),接收格式化短信(如“您的訂單#123 已確認(rèn)”)。
集成 Lambda 處理失敗通知:若庫存預(yù)留失敗,觸發(fā) Lambda 函數(shù)向同一主題發(fā)送“失敗消息”,SNS 自動推送至用戶手機(jī)(如“訂單#123 預(yù)留失敗,請聯(lián)系客服”)。
啟用消息過濾:通過訂閱屬性設(shè)置(如 tock-status = [success|fail]),確保用戶僅接收與其訂單相關(guān)的通知,避免信息過載。
步驟一:創(chuàng)建 SNS 主題
登錄 AWS 控制臺,進(jìn)入 SNS 服務(wù),點(diǎn)擊“創(chuàng)建主題”,命名(如 OrderEvents)并記錄 ARN。
步驟二:配置訂閱
為庫存管理模塊創(chuàng)建 HTTP 訂閱:輸入 API 網(wǎng)關(guān)端點(diǎn) URL,確認(rèn)訂閱后保存確認(rèn)令牌(用于服務(wù)端驗證)。
為用戶手機(jī)創(chuàng)建 SMS 訂閱:輸入國際格式手機(jī)號(如 +8613800000000),接收驗證短信完成訂閱。
步驟三:發(fā)布測試消息
在 SNS 主題的“發(fā)布消息”頁面,輸入 JSON 消息(如{"order_id": "123", "status": "success"}),選擇“發(fā)布”。
步驟四:集成 Lambda(可選)
創(chuàng)建 Lambda 函數(shù),綁定 SNS 主題作為觸發(fā)器,編寫邏輯:若檢測到 tatus=fail,調(diào)用 SNS API 向主題發(fā)送失敗通知消息。
消息到達(dá)率
庫存管理模塊的 HTTP 端點(diǎn)成功接收 JSON 消息,日志顯示請求來源為 ns.amazonaws.com,驗證消息簽名通過。
用戶手機(jī)在 10 秒內(nèi)收到 SMS 通知,內(nèi)容與發(fā)布消息中的 tatu 字段動態(tài)匹配(如“訂單 123 確認(rèn)”或“預(yù)留失敗”)。
容錯性測試
模擬庫存預(yù)留失敗,觸發(fā) Lambda 函數(shù)向 SNS 發(fā)送失敗消息,用戶手機(jī)二次接收通知,驗證多消息場景下的訂閱邏輯正確性。
成本與性能
通過 CloudWatch 監(jiān)控 SNS 的 PublishSize 和 NumberOfMessagesPublished 指標(biāo),確認(rèn)高并發(fā)下無延遲(平均推送時間<1 秒)。
計費(fèi)報告顯示僅按發(fā)布消息數(shù)(約 0.5/100 萬次)和 SMS 條數(shù)(依區(qū)域定價,如 0.0064/ 條)收費(fèi),成本顯著低于自建通知系統(tǒng)。