什么是 AWS SNS

Amazon SNS(Amazon Simple Notification Service)是 AWS 提供的一种 完全托管的发布/订阅(Pub/Sub)消息服务。 它用于在系统之间传递消息,可以实现 异步通信、事件分发、通知推送 等功能。

当某个系统里发生了事件(如下单成功、文件上传完成、账单到期、告警触发),你把这条事件消息发布到 SNS,SNS 再把它推送给订阅者(其他服务、队列、HTTP 接口、短信/邮件等),实现系统之间的解耦和异步处理。

简单来说:

SNS = 消息广播系统,发布者发消息 → SNS Topic → 多个订阅者同时接收。

简单理解

把它想成一个“群发通知中心”。你希望“通知别人去干活”,但你又不想在当前代码里挨个调用一堆服务(不然很乱、也容易卡住主流程)。

应用场景

当系统里发生了一个事件,你想把“消息/通知”快速、可靠地广播给一个或多个下游(服务、队列、函数、Webhook、邮件/短信等),用来解耦和异步化。

  • 微服务事件广播(典型 Pub/Sub)
  • SNS → SQS:削峰填谷 + 异步处理(工程里最常见组合)
  • 系统告警与通知(运维/可观测性)
  • 任务完成/失败通知(异步任务编排)
  • 文件处理流水线(上传后触发处理)
  • 跨系统集成(Webhooks / 事件推送)
  • 发送用户通知(邮件/短信/推送)
  • 多环境/多团队解耦:让新订阅者“无侵入接入”
  • 多区域/多账号事件分发(更偏云架构)

主要概念

Topic(主题)

Subscription(订阅)

流程

1
2
3
4
5
6
7
8
9
flowchart LR
  P["Publisher<br/>支付服务/后端"]
  T["SNS Topic<br/>payment-success"]

  P -->|SNS.publish&#40;payment-success, orderId=123&#41;| T

  T -->|Subscription A| A["Service A<br/>积分服务"]
  T -->|Subscription B| B["Service B<br/>邮件服务"]
  T -->|Subscription C| C["Service C<br/>日志/风控"]

配置


设置 SNS 访问策略 (Access Policy)

  • 在刚才创建的 SNS Topic 页面,点击 Access policy (访问策略) 标签页。

核心概念

概念 说明
Topic(主题) 消息通道,发布者将消息发到某个 Topic
Publisher(发布者) 负责发布消息的应用或服务
Subscriber(订阅者) 接收消息的终端,可以是 HTTP(S) 端点、Email、SQS 队列、Lambda 等
Subscription(订阅) 订阅关系。订阅后 SNS 会推送消息到订阅者
Message(消息) 发布者发送的内容(文本、JSON 等)

常见的使用场景

  1. 系统事件通知

    • 当有新用户注册、订单生成、任务完成等事件时,发送通知到多个服务或用户。
  2. 分布式系统通信

    • SNS 与 SQS(Simple Queue Service)结合:SNS 负责广播消息,SQS 负责解耦与持久化。
  3. 报警与监控

    • 与 CloudWatch 结合,在系统异常时自动推送告警到邮箱、短信或 Webhook。
  4. 邮件与短信推送

    • SNS 支持 Email、SMS 推送,适合发送简短的通知类消息。
  5. 事件触发工作流

    • SNS 触发 AWS Lambda,进行后续逻辑处理(如图像分析、日志写入等)。

支持的订阅协议

协议 示例
HTTP/HTTPS 发送到 Webhook(常见于事件回调)
Email / Email-JSON 发送邮件通知
SQS 推送到队列,供后台异步处理
Lambda 自动调用 AWS Lambda 函数
SMS 短信通知
Platform Application Endpoint 用于移动推送(iOS / Android)

SNS 与其他 AWS 服务关系

服务 关系
SQS SNS 发布 → SQS 订阅,实现一对多异步解耦
SES SES 是邮件发送服务;SNS 是消息广播服务,SES 可以把发送结果事件(如退信、投递)发送到 SNS
EventBridge SNS 偏向简单消息推送,EventBridge 偏向复杂事件总线(过滤与路由更强)

示例流程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 1. 创建主题
aws sns create-topic --name myTopic

# 2. 订阅一个邮箱
aws sns subscribe \
  --topic-arn arn:aws:sns:us-east-1:123456789012:myTopic \
  --protocol email \
  --notification-endpoint your@email.com

# 3. 发布消息
aws sns publish \
  --topic-arn arn:aws:sns:us-east-1:123456789012:myTopic \
  --message "Hello SNS!"

优缺点

优点

  • 无需服务器维护,完全托管
  • 支持多种协议和高并发
  • 与其他 AWS 服务深度集成
  • 消息可靠传递与重试机制

缺点

  • 消息仅短暂保存(不像 SQS 有持久化队列)
  • 不支持复杂过滤逻辑(EventBridge 更强)
  • 消息顺序与去重需自行控制