在构建现代分布式系统和事件驱动架构(event-driven architectures)时,消息传递服务是关键组件。AWS 提供了两项广泛使用的、完全托管的消息服务(fully managed message services):Amazon Simple Notification Service(SNS)和 Amazon Simple Queue Service(SQS)。虽然两者在功能上有相似之处,但它们的底层原理、使用场景和优势差异显著。
本文将由 Oncloud AI 为您详细解析 SNS 与 SQS 的主要区别,帮助您根据实际需求选择合适的服务。
什么是Amazon SNS?
Amazon Simple Notification Service(SNS)是一种基于“发布-订阅模型(pub/sub)”的推送通知系统(push notification system),支持将消息推送给多个订阅者(messages to multiple subscribers)。它支持两种类型的目标:应用到应用(A2A)和应用到个人(A2P)。
SNS 支持的 A2A 目标包括:
- AWS Lambda
- Amazon SQS
- Amazon Kinesis Data Firehose
- AWS Event Fork 管道
- HTTP 端点
SNS 支持的 A2P 目标包括:
- 短信 (SMS)
- 电子邮件
- 应用内通知
- AWS Chatbot
- 寻呼机职责
SNS 提供标准主题和 FIFO 主题。标准主题性能高,延迟低;而 FIFO 主题支持消息顺序和去重,适用于要求严格消息顺序的业务场景。
什么是 Amazon SQS?
Amazon Simple Queue Service(SQS)是一种基于轮询(polling)的异步处理服务(asynchronous processing service),用于将系统模块解耦,实现后台任务和异步工作负载。
SQS 的使用模式是生产者将消息发送到队列中,消费者按需轮询队列并获取消息进行处理。SQS 提供两种类型的队列:
- 标准队列:支持高吞吐量、至少一次投递
- FIFO 队列(fifo queues):保证消息顺序和唯一性
SQS 支持设置保留期(message retention),最长可达 14 天,还支持死信队列(Dead Letter Queue, DLQ),用于处理多次失败的消息,提高消息可靠性(reliable message delivery)。
SNS 与 SQS 的主要区别
1. 推送 vs 轮询
- SNS 是基于推送的服务,一旦消息发布,就立即传递给所有订阅者。
- SQS 是基于轮询的服务,消息发布后存储在队列中,等待消费者轮询处理。
2. 多对多 vs 多对一
- SNS 支持多对多的关系,一个 SNS topic 可有多个发布者和订阅者。
- SQS 通常为多对一关系,多个生产者可以发送消息,但消息通常由一个消费者处理。
3. 消息持久性
- SNS 不保证消息持久性,如果在消费者不可用时推送消息,该消息将被丢弃。
- SQS 提供强大的持久化机制,确保消息被接收或通过 DLQ 进行后续处理。
4. 消息重试机制
- SNS 默认无重试机制,若推送失败则消息丢失。
- SQS 提供重试机制及 DLQ,可设置最大重试次数。
5. 批处理能力
- SNS 只支持单条消息推送。
- SQS 支持批量处理(batch processing),标准队列每批最多可处理 10,000 条消息,FIFO 队列最多 10 条。
使用场景对比
适合使用 SNS 的场景:
- 需要推送消息到多个不同系统或平台
- 实时通知用户(如短信、邮件、App 通知)
- 实现扇出模式(fan-out pattern)广播消息到多个订阅者
适合使用 SQS 的场景:
- 后台任务处理,需支持异步与持久性
- 系统组件之间解耦,避免直接通信
- 对消息可靠性、重试机制要求高
- 批量处理消息
扇出模式:SNS 与 SQS 结合使用
在一些场景中,您可以将 SNS 与 SQS 结合使用。例如,SNS 将消息发布到多个 SQS 队列,每个队列对应一个处理逻辑。这种方式称为“扇出模式”。
示例:
- 用户上传图片
- SNS 发布上传事件
- 多个 SQS 队列接收消息:
- 队列 A:图片识别
- 队列 B:缩略图生成
- 队列 C:通知用户
通过该模式,您可以实现可靠的异步处理和模块解耦。
EventBridge 与 Kinesis:其他选择
除了 SNS 和 SQS,AWS 还提供其他消息和事件服务:
Amazon EventBridge
- 事件总线服务,支持事件过滤、路由
- 可将事件发送至 SNS、SQS、Lambda 等目标
- 适用于复杂的事件处理逻辑
Amazon Kinesis
- 用于处理和分析实时流数据
- 支持高吞吐和复杂的数据处理
总结
Amazon SNS 与 Amazon SQS 是构建可扩展、高可用系统的核心组件。SNS 适用于实时推送通知和一对多场景,而 SQS 更适合异步处理与系统解耦。
选择合适的服务不仅能提升系统性能,也能降低耦合性和维护成本。
Oncloud AI 作为 AWS 官方合作伙伴,提供包括 AWS 代付、AWS 云服务器迁移、SQS/SNS 架构咨询、云服务托管等专业服务。如有需求,欢迎扫描页面底部二维码联系我们!