0Pricing
Cloud & IT Cert Prep · 课时

SQS 消息筛选与 SNS + SQS 集成

应用 SNS 订阅筛选策略,让每个 SQS 消费者只接收所需消息,从而减少不必要的处理。

SQS 消息筛选与 SNS + SQS 集成 是 CoddyKit 上的免费 Cloud & IT Cert Prep 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cloud & IT Cert Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cloud & IT Cert Prep 课程共包含 4 节课。

没有筛选时的问题

在没有筛选的扇出架构中,每个 SQS 订阅者都会收到每条 SNS 消息。如果您的主题发布 10 个不同产品类别的订单事件,而某个订阅者只处理电子产品订单,那么它仍会收到食品和服装消息,并且必须将其丢弃。这会浪费计算资源、增加成本,并给使用者带来不必要的负载。SNS 订阅筛选策略通过让 SNS 自身只向适当的订阅者路由消息来解决这一问题。

SNS 筛选策略的工作原理

筛选策略是应用于 SQS 或 Lambda 订阅的 JSON 对象。SNS 会在投递每条消息之前,根据消息的消息属性评估该策略。如果消息属性与筛选策略匹配,就会投递消息;如果不匹配,SNS 会静默跳过该订阅者。筛选策略支持字符串匹配、数值范围、前缀匹配,以及用于检查属性是否存在的 exists 运算符。

# Filter policy: only deliver ELECTRONICS orders from US or EU
{
  'category': ['ELECTRONICS'],
  'region': ['US', 'EU'],
  'amount': [{'numeric': ['>=', 100]}]
}

筛选策略范围:消息属性与正文

默认情况下,筛选策略会匹配消息属性(元数据)。从 2023 年起,SNS 还支持通过将筛选策略范围设置为 MessageBody 来进行基于有效负载(正文)的筛选。这样无需发布者添加属性,即可直接根据消息正文中的 JSON 路径进行筛选。正文筛选更加灵活,但要求消息正文必须是有效的 JSON。请始终确认哪种范围与发布者的输出格式相匹配。

# Set filter scope to MessageBody
aws sns set-subscription-attributes \
  --subscription-arn 'arn:aws:sns:...' \
  --attribute-name FilterPolicyScope \
  --attribute-value MessageBody

aws sns set-subscription-attributes \
  --subscription-arn 'arn:aws:sns:...' \
  --attribute-name FilterPolicy \
  --attribute-value '{"category": ["ELECTRONICS"]}'

数值和前缀筛选条件

筛选策略支持多种匹配运算符,不仅限于简单的字符串相等匹配:

  • 数值:{"numeric": ["=", 100]}、{"numeric": [">", 50, "<=", 200]}
  • 前缀:{"prefix": "order-"}匹配以该前缀开头的任意字符串
  • 排除指定值:{"anything-but": ["CANCELLED"]}匹配除列出值以外的任意值
  • 存在性:{"exists": true}在属性存在时匹配;属性不存在时使用 false

发布带属性的消息以进行筛选

要使筛选正常工作,发布者必须在向 SNS 发布消息时包含消息属性。属性是带有数据类型(String、Number、Binary)的键值对。发布者不需要知道哪些订阅者配置了哪些筛选策略——它只需为消息添加描述事件的属性即可。SNS 会自动处理路由。这样可以让发布者与订阅者特定的逻辑完全解耦。

aws sns publish \
  --topic-arn 'arn:aws:sns:us-east-1:123456789012:OrderTopic' \
  --message '{"orderId": "789", "total": 250.00}' \
  --message-attributes '{
    "category": {"DataType": "String", "StringValue": "ELECTRONICS"},
    "region": {"DataType": "String", "StringValue": "US"},
    "amount": {"DataType": "Number", "StringValue": "250"}
  }'

多层扇出:SNS + 多个 SQS

复杂的扇出拓扑可以让 SNS 按多个具体程度将消息路由到 SQS 队列:一个队列接收所有订单(无筛选)以用于审计;另一个队列只接收 HIGH_VALUE 订单(金额 >= 1000)以供欺诈审核;第三个队列只接收 ELECTRONICS 订单以供电子产品仓库处理。每个 SQS 队列都有自己的 Lambda 使用者。这种模式可以独立扩展各个处理层,并且无需修改现有使用者或发布者即可添加新的使用者。

跨账户 SNS 到 SQS 的投递

SNS 可以向其他 AWS 账户中的 SQS 队列投递消息。SQS 队列的基于资源的策略必须允许 SNS 服务主体从发布账户的 SNS 主题 ARN 调用 sqs:SendMessage。这样无需共享凭证即可实现集中式事件发布(一个账户发布,多个账户团队订阅)。跨账户扇出是多账户 AWS Organizations 环境中的常见模式。

# SQS queue policy to allow cross-account SNS delivery
{
  'Version': '2012-10-17',
  'Statement': [{
    'Effect': 'Allow',
    'Principal': {'Service': 'sns.amazonaws.com'},
    'Action': 'sqs:SendMessage',
    'Resource': 'arn:aws:sqs:us-east-1:CONSUMER_ACCOUNT:MyQueue',
    'Condition': {
      'ArnEquals': {'aws:SourceArn': 'arn:aws:sns:us-east-1:PUBLISHER_ACCOUNT:MyTopic'}
    }
  }]
}

在 Lambda 之前使用 SQS 作为缓冲区

当事件量激增时,直接从 SNS 调用 Lambda 会立即扩展 Lambda,可能使下游数据库或 API 不堪重负。在 SNS 和 Lambda 之间添加 SQS 可以创建一个缓冲区:SNS 将消息投递到 SQS,Lambda 按受控的批处理大小轮询 SQS。这样,Lambda 可以按照可持续的速率处理消息,而 SQS 则吸收流量峰值。队列深度可以充当反压力机制——您可以对其进行监控,并在它增长到超过阈值、表明使用者出现延迟时发出警报。

比较直接 Lambda 与 SQS 缓冲的扇出

SNS → Lambda(直接):延迟最低、没有缓冲,Lambda 会立即扩展。最适合实时告警或紧急通知等重视亚秒级延迟的场景。SNS → SQS → Lambda:增加了 DLQ 支持、受控吞吐量、带可见性超时的重试,以及队列深度监控。最适合交易处理、库存更新,以及必须遵守下游限制的任何场景。对于考试题目,只要题目提到持久性和速率控制,就应选择 SQS 缓冲。

测试筛选策略

使用 SNS 控制台中的筛选策略编辑器,在部署之前测试示例消息是否会匹配您的筛选策略。您还可以使用SNS 沙盒模拟消息传递并验证路由。在代码中,可以通过发布带有已知属性的测试消息,并检查每个订阅的 CloudWatch 指标来验证筛选策略:NumberOfMessagesFiltered 指标显示有多少条消息被筛选策略阻止,帮助您在无需等待生产事件的情况下调整策略。

端到端集成总结

完整的 SNS + SQS 集成如下所示:(1) 应用程序将带有消息属性的事件发布到SNS 标准主题;(2) SNS 评估每个订阅的筛选策略,仅将匹配的消息传递到相应的 SQS 队列;(3) Lambda 按照配置的批处理大小轮询每个 SQS 队列并处理消息;(4) 失败消息在达到 maxReceiveCount 后进入队列的DLQ;(5) 针对 DLQ 深度设置的CloudWatch 告警向团队发出提醒。这种完全解耦且具有弹性的模式,是 SAA-C03 架构的典型示例。

快速检查

测试您对本课 AWS 解决方案架构师(SAA-C03)概念的理解。

课程回顾

在本课中,您学习了:SNS 筛选策略在 SNS 层根据消息属性或消息正文内容路由消息,从而避免下游使用者进行不必要的处理;SNS→SQS→Lambda模式在扇出广播与处理之间提供持久缓冲和速率控制;跨账户 SQS 传递则利用队列资源策略,在多账户环境中实现集中式发布/订阅。接下来,我们将探索 Amazon API Gateway 的 REST、HTTP 和 WebSocket API。

常见问题解答

「SQS 消息筛选与 SNS + SQS 集成」课时是免费的吗?

是的 — 「SQS 消息筛选与 SNS + SQS 集成」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cloud & IT Cert Prep 课程的其余内容,请升级到 CoddyKit PRO。 Cloud & IT Cert Prep 课程共包含 4 节课。

「SQS 消息筛选与 SNS + SQS 集成」这节课中我会学到什么?

应用 SNS 订阅筛选策略,让每个 SQS 消费者只接收所需消息,从而减少不必要的处理。 你通过在浏览器中直接运行的动手代码来练习 Cloud & IT Cert Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cloud & IT Cert Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cloud & IT Cert Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「SQS 消息筛选与 SNS + SQS 集成」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cloud & IT Cert Prep 课中编写并运行代码吗?

能。每节 Cloud & IT Cert Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. SQS Standard 与 FIFO 队列
  2. 可见性超时、DLQ 与长轮询
  3. SNS 主题与扇出架构
  4. SQS 消息筛选与 SNS + SQS 集成
← 返回 Cloud & IT Cert Prep