什么是 Amazon Simple Queue Service?
Amazon Simple Queue Service (Amazon SQS) 提供了一个安全、持久且可用的托管队列,以允许您集成和分离分布式软件系统与组件。Amazon SQS 提供常见构造,例如死信队列和成本分配标签。它提供一个通用 Web 服务 API,您可通过 Amazon SDK 支持的任何编程语言访问该 API。
使用 Amazon SQS 的优势
-
安全性 – 您可以控制谁能向 Amazon SQS 队列发送消息以及谁能从该队列接收消息。您可以选择通过使用默认 Amazon SQS 托管服务器端加密 (SSE) 或使用在 Amazon Key Management Service (Amazon KMS) 中管理的自定义 SSE 密钥来保护队列中的消息内容,从而传输敏感数据。
-
持久性 – 为确保您消息的安全,Amazon SQS 将消息存储在多个服务器上。标准队列支持至少一次消息传送,而 FIFO 队列支持仅处理一次和高吞吐量模式。
-
可用性 – Amazon SQS 使用冗余基础设施为生成和使用消息提供高度并发的消息访问和高可用性。
-
可扩展性 – Amazon SQS 可独立处理各个缓冲的请求,并可透明扩展以处理任何负载增加或峰值,无需任何预配置指令。
-
可靠性 – Amazon SQS 在处理期间锁定消息,以便多个创建者同时发送消息,多个使用者同时接收消息。
-
自定义 – 您的队列不必完全相同,例如,您可以设置队列的默认延迟。您可以使用 Amazon Simple Storage Service(Amazon S3)或 Amazon DynamoDB 存储大于 1 MiB 的消息内容,Amazon SQS 保留指向 Amazon S3 对象的指针;或者,您也可以将一条大消息拆分为几条小消息。
基本 Amazon SQS 架构
本部分简要介绍了分布式消息收发系统的组成部分,并说明了 Amazon SQS 消息的生命周期。
分布式队列
分布式消息收发系统有三个主要部分:分布式系统的组件、队列(分布在 Amazon SQS 服务器上)以及队列中的消息。
在以下场景中,您的系统有多个创建者(向队列发送消息的组件)和使用者(从队列接收消息的组件)。队列(保存从 A 到 E 的消息)在多个 Amazon SQS 服务器上冗余存储消息。
消息生命周期
以下场景介绍 Amazon SQS 消息在队列中从创建到删除的整个生命周期。
创建者(Component 1)将消息 A 发送到一个队列,该消息以冗余方式在 Amazon SQS 服务器间分布。
使用者(Component 2)准备好处理消息时,会从队列使用消息,然后返回消息 A。在处理消息 A 期间,它仍保留在队列中,并且在可见性超时期间不返回至后续接收请求。
使用者(Component 2)从队列中删除消息 A,以阻止该消息在可见性超时过期后被再次接收和处理。
注意
Amazon SQS 会自动删除在队列中已过了最大消息保存期的消息。默认的消息保存期为 4 天。不过,您可使用 SetQueueAttributes 操作将消息保存期设为介于 60 秒和 1209600 秒(14 天)之间的值。
Amazon SQS、Amazon MQ 和 Amazon SNS 之间的区别
Amazon SQS、Amazon SNS
Amazon SQS 作为队列服务,可以实现分布式软件系统和组件的分离和扩展。它通常通过单个订阅用户来处理消息,非常适合对顺序和防止消息丢失有严格要求的工作流程。如果需要更广泛的分发,可以将 Amazon SQS 与 Amazon SNS 集成,启用扇出消息传送
Amazon SNS 让发布者通过作为通信渠道的主题向多个订阅用户发送消息。订阅用户可以使用受支持的端点类型接收已发布的消息,例如,Amazon Data Firehose、Amazon SQS、Lambda、HTTP、电子邮件、移动推送通知和移动短信(SMS)。该服务非常适合需要即时通知的场景,例如实时用户参与或警报系统。为了防止订阅用户离线时消息丢失,将 Amazon SNS 与 Amazon SQS 队列消息集成可以确保消息传递的一致性。
Amazon MQ 最适合希望从传统消息代理迁移的企业,支持 AMQP 和 MQTT 等标准消息协议,以及 Apache ActiveMQ
下表概述了每种服务的资源类型:
| 资源类型 | Amazon SNS | Amazon SQS | Amazon MQ |
|---|---|---|---|
| 同步 | 否 | 否 | 是 |
| 异步 | 支持 | 是 | 是 |
| 队列 | 否 | 是 | 是 |
| 发布/订阅消息收发 | 是 | 否 | 是 |
| 消息代理 | 否 | 否 | 是 |
我们建议对新的应用程序使用 Amazon SQS 和 Amazon SNS,这样可以实现几乎不受限制的可扩展性和简单 API。对于高容量应用程序来说,它们采用的即用即付定价模式通常可以提供更具成本效益的解决方案。我们建议使用 Amazon MQ 从依赖与 API(如 JMS)或协议(如 Advanced Message Queuing Protocol (AMQP)、MQTT、OpenWire 和 Simple Text Oriented Message Protocol (STOMP))的兼容性的现有消息代理迁移应用程序。