SNS 主题与扇出架构
向一个 SNS 主题发布消息,同时将其扇出到多个 SQS 队列、Lambda 函数和 HTTP 端点。
SNS 主题与扇出架构 是 CoddyKit 上的免费 Cloud & IT Cert Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cloud & IT Cert Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cloud & IT Cert Prep 课程共包含 4 节课。
什么是 Amazon SNS
Amazon Simple Notification Service (SNS) 是一种完全托管的发布/订阅消息服务。发布者将消息发送到 SNS 主题,SNS 会立即将这些消息投递给所有订阅者。与 SQS(基于拉取)不同,SNS 是基于推送的——消息一经发布,就会立即投递给订阅者。因此,SNS 非常适合同时向多个下游系统广播事件。
SNS 主题:Standard 和 FIFO
aws sns create-topic --name 'OrderEvents'
# Create FIFO topic
aws sns create-topic \
--name 'OrderEvents.fifo' \
--attributes '{"FifoTopic": "true", "ContentBasedDeduplication": "true"}'SNS 订阅者类型
SNS 支持多种基于协议的订阅者类型:
- SQS:持久化排队(异步处理最常见)
- Lambda:直接调用(从 SNS 的角度看是同步的)
- HTTP/HTTPS:向外部终端节点投递 Webhook
- 电子邮件 / Email-JSON:向人员发送通知
- SMS:投递文本消息
- 移动推送:通过平台应用使用 FCM、APNs
- Firehose:通过 Kinesis Data Firehose 将流传输到 S3 或 Redshift
# Subscribe an SQS queue to an SNS topic
aws sns subscribe \
--topic-arn 'arn:aws:sns:us-east-1:123456789012:OrderEvents' \
--protocol sqs \
--notification-endpoint 'arn:aws:sqs:us-east-1:123456789012:InventoryQueue'扇出架构模式
扇出是 SNS 的核心模式:将一条消息发布到主题后,SNS 会同时将其投递给所有订阅者。例如,一条新订单事件可以扇出到:用于仓库履约的 SQS 队列、用于库存更新的另一个 SQS 队列、用于欺诈检测的 Lambda 函数,以及供运营团队使用的电子邮件订阅。每个订阅者都可以独立处理事件,彼此之间不存在耦合。这种方式的可扩展性远高于由单个使用者将消息路由到多个系统。
SNS + SQS 扇出:最佳实践
推荐的模式是组合使用 SNS 和 SQS:发布到 SNS,由 SNS 扇出到多个 SQS 队列。这样可以提供:
- 持久性:如果使用者停机,消息会在 SQS 中排队
- 独立扩展:每个使用者都可以按照自己的速度处理消息
- 解耦:新使用者只需订阅 SNS,无需更改发布者
- 重试可靠性:SQS 提供可见性超时和 DLQ
直接订阅 Lambda 没有 SQS 提供的缓冲能力,因此 SNS→SQS→Lambda 是更具韧性的三层模式。
消息投递重试和 DLQ
当 SNS 无法向订阅者投递消息时(HTTP 终端节点返回 5xx、Lambda 抛出错误或 SQS 不可用),它会采用指数退避策略进行重试。不同协议的重试策略有所不同:HTTP 终端节点最多立即重试 4 次,然后在 23 天内采用指数退避;Lambda 和 SQS 的重试则由各自的重试机制管理。请配置SNS 主题 DLQ,以捕获耗尽所有投递重试次数的消息,确保事件不会在无提示的情况下丢失。
向 SNS 发布消息
您可以使用 AWS SDK 或 CLI 向 SNS 发布消息。每条消息都可以包含用于电子邮件的主题、大小最多为 256 KB 的消息正文,以及用于路由的消息属性。对于不同的订阅者类型(SQS、电子邮件或移动设备),您可以使用消息结构向每种协议发送不同的内容——包含特定协议键的 JSON 可以让您针对不同订阅者类型定制有效负载。
aws sns publish \
--topic-arn 'arn:aws:sns:us-east-1:123456789012:OrderEvents' \
--message '{"orderId": "12345", "status": "PLACED", "amount": 99.99}' \
--subject 'New Order Placed' \
--message-attributes '{
"orderType": {"DataType": "String", "StringValue": "PREMIUM"}
}'SNS 订阅筛选策略
订阅筛选策略可以根据消息属性,让每个订阅者只接收与其相关的消息。如果不进行筛选,所有订阅者都会收到所有已发布的消息。使用筛选策略时,订阅者可以指定自己关注的属性值。例如,一个处理 'PREMIUM' 订单的队列可以使用筛选条件 {"orderType": ["PREMIUM"]} 进行订阅;一个 'STANDARD' 队列则可以使用 ["STANDARD"] 进行筛选。每个订阅者只处理与其相关的消息子集,从而减少不必要的处理。
aws sns set-subscription-attributes \
--subscription-arn 'arn:aws:sns:...:subscription/...' \
--attribute-name FilterPolicy \
--attribute-value '{"orderType": ["PREMIUM"], "region": ["US", "EU"]}'用于移动推送通知的 SNS
SNS 支持直接向 iOS(APNs)和 Android(FCM/GCM)设备发送移动推送通知。您可以将设备令牌注册为平台终端节点 ARN,然后直接向终端节点发布消息,或向包含平台应用订阅者的主题发布消息。对于大规模的设备直达通知(数百万台设备),可以将 SNS 与SQS 扇出结合使用:SNS 将通知事件路由到 SQS,工作服务负责大批量令牌解析和投递。
SNS 消息加密和访问控制
使用 AWS KMS 的服务器端加密保护 SNS 消息。这会在 SNS 基础设施中对静态消息进行加密。访问控制同时使用基于资源的策略(规定谁可以向主题发布或从主题订阅)和IAM 策略。若要允许 S3 存储桶向 SNS 主题发布通知,请在主题的资源策略中向 S3 服务主体授予 sns:Publish 权限。请始终将发布权限限制为授权来源,以防止未经授权的事件注入。
SNS 与 SQS:互补服务
SNS 和 SQS 是互补服务,而不是二选一的替代方案。SNS(推送)用于立即向多个使用者广播消息——当多个系统必须对某个事件作出响应时,请使用它。SQS(拉取)用于可靠、持久的单使用者处理,并提供重试和 DLQ——当一个使用者必须按照自己的速度恰好处理每条消息一次时,请使用它。SNS→SQS 扇出模式可以同时提供两者:SNS 的广播投递能力,以及 SQS 的持久化和可重试处理能力。这种组合经常出现在 SAA-C03 考试场景中。
快速检查
测试您对本课 AWS Solutions Architect (SAA-C03) 概念的理解。
课程回顾
在本课中,您学习了:SNS 主题提供基于推送的发布/订阅广播,可同时向包括 SQS、Lambda、HTTP、SMS 和电子邮件在内的订阅者发送消息;扇出架构使用一个 SNS 主题向多个 SQS 队列发送消息,从而实现持久化且可独立扩展的多使用者事件处理;订阅筛选策略根据消息属性,仅将相关事件路由给相应订阅者,从而减少不必要的处理。接下来,我们将深入探索 SQS 消息筛选以及 SNS + SQS 集成。
常见问题解答
「SNS 主题与扇出架构」课时是免费的吗?
是的 — 「SNS 主题与扇出架构」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cloud & IT Cert Prep 课程的其余内容,请升级到 CoddyKit PRO。 Cloud & IT Cert Prep 课程共包含 4 节课。
「SNS 主题与扇出架构」这节课中我会学到什么?
向一个 SNS 主题发布消息,同时将其扇出到多个 SQS 队列、Lambda 函数和 HTTP 端点。 你通过在浏览器中直接运行的动手代码来练习 Cloud & IT Cert Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cloud & IT Cert Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cloud & IT Cert Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「SNS 主题与扇出架构」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cloud & IT Cert Prep 课中编写并运行代码吗?
能。每节 Cloud & IT Cert Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。