Amazon Simple Queue Service (Amazon SQS) 是一项 Web 服务,让您能够访问存储待处理消息的消息队列。借助 Amazon SQS,您能够快速构建可在任何计算机上运行的消息队列应用程序。

Amazon SQS 可以提供可靠、安全并且高度可扩展的托管队列服务,用于存储在计算机之间传输的消息。借助 Amazon SQS,您可以在不同的分布式应用程序组件之间移动数据,同时既不会丢失消息,也不需要各个组件始终处于可用状态。您可以使用与 AWS Key Management Service (KMS) 集成的 Amazon SQS 服务器端加密 (SSE) 在应用程序之间交换敏感数据。

Amazon SQS 可帮助您构建组件相互解耦的分布式应用程序,而且这些应用程序可与 Amazon Elastic Compute Cloud (Amazon EC2) 及其他 AWS 基础设施 Web 服务紧密配合。

Amazon SQS 针对不同应用程序要求提供了两种队列类型:

标准队列
Amazon SQS 提供标准队列作为默认队列类型。标准队列使您能够每秒处理近乎无限数量的事务。标准队列可确保每条消息至少被传送一次。但是,由于允许高吞吐量的高度分布式架构,偶尔会有一条消息的某个副本不按顺序传送。标准队列提供最大努力排序,可保证消息大致按其发送的顺序进行传送。

FIFO 队列 – 新功能!
FIFO 队列是对标准队列的补充。这种队列类型最重要的功能是 FIFO (先进先出) 传送和一次性处理:让消息的发送顺序和接收顺序严格保持一致,且消息只传送一次并保留到用户将其处理和删除;重复的消息不会被引入队列。FIFO 队列还支持消息组,即允许在单个队列中传送多个有序流。FIFO 队列的上限是 300 个事务/秒 (TPS),但具有标准队列的全部功能。

 

开始免费使用 AWS

创建免费账户
或登录到控制台

AWS 免费套餐包含 100 万个 Amazon Simple Queue Service (SQS) 请求。

查看 AWS 免费套餐详细信息 »

Capital One 分享了他们如何利用 Amazon SQS 将核心银行应用程序迁移到云中。

sqs_thumb_reInvent2016-migrating-ent-messaging

您可以通过 AWS 管理控制台轻松访问 AWS SQS,使用该控制台的点选式 Web 界面可设置和管理 Amazon SQS。

Amazon SQS 采用了简单的接口,不仅易于使用,而且非常灵活。它提供了下列请求:

基本消息操作

  • SendMessage:发送消息到指定的队列。
  • ReceiveMessage:从指定的队列返回一条或多条消息。
  • DeleteMessage:从指定的队列删除一条以前收到的消息。
  • ChangeMessageVisibility:为一条以前收到的消息更改可见性超时。

批量消息操作

  • SendMessageBatch:发送多条消息到指定的队列。
  • DeleteMessageBatch:从指定的队列删除多条以前收到的消息。
  • ChangeMessageVisibilityBatch:为多条以前收到的消息更改可见性超时。

基本队列管理

  • CreateQueue:创建可用于您的 AWS 账户的队列。
  • ListQueues:列出现有的队列。
  • DeleteQueue:删除其中一个队列。
  • PurgeQueue:删除一个队列中的所有消息。

高级队列管理

  • SetQueueAttributes:控制队列设置,例如可见性超时(消息在读取后进行锁定从而使其不能再被读取所持续的时间)、延迟值或死信队列参数。
  • GetQueueAttributes:获取队列信息,例如可见性超时、队列中消息的数量或最大消息大小。
  • GetQueueUrl:获取队列 URL。
  • AddPermission:为指定的队列添加对其他 AWS 账户的队列共享。
  • RemovePermission:从指定队列的队列共享中删除一个 AWS 账户。
  • ListDeadLetterSourceQueues:列出死信队列的关联队列。

有关更多详细信息,请参阅 Amazon SQS API Reference

Amazon SQS 中存储的消息具有生命周期,不仅管理轻松,而且还能确保所有消息都得到处理。

  1. 需要发送消息的系统可以选择一个 Amazon SQS 队列,再通过 SendMessage 向该队列发送新的消息。
  2. 处理消息的另一系统需要处理更多消息,因此调用 ReceiveMessage,并返回此消息。
  3. 一旦消息被 ReceiveMessage 返回后,便无法再由任何其他 ReceiveMessage 返回,直到过了其可见性超时为止。这可防止多位用户同时处理相同的消息。
  4. 如果处理消息的系统成功完成对此消息的处理,它会调用 DeleteMessage 将消息从队列中删除,这样其他系统就不会再处理该消息了。如果此系统未能成功处理该消息,则到达可见性超时后,该消息即可由其他 ReceiveMessage 调用读取。
  5. 如果您将死信队列与源队列相关联,当您指定的最大交付尝试次数达到时,消息会移动到死信队列中。
  • 开发人员可以创建任意数量的 Amazon SQS 队列,队列可包含无限数量的消息。
    • 可以在任何区域创建队列。
    • 此消息负载可包含最多 256 KB 的文本(格式不限)。每 64 KB“区块”的已发布数据以 1 次请求计费。例如,1 次负载为 256 KB 的 API 调用将以 4 次请求计费。
    • 可以批发送、接收或删除消息,每批最多 10 条消息或 256 KB。批消息与单条消息的消耗量相同,这意味着对于使用批消息的客户而言,SQS 更具成本效益。
    • 要发送大小超过 256KB 的消息,您可以使用 Amazon SQS Extended Client Library for Java,它采用 Amazon S3 来存储消息负载。需要使用 SQS 发送消息负载的引用。
    • 长轮询在尽可能快地接收新消息的时候减少外部轮询,从而为您减少成本。在您的队列为空时,长轮询请求会为下一条消息等待至多 20 秒。长轮询请求和普通请求的消耗量相同。
    • 消息可以在队列中最多保留 14 天。
    • 可以同时发送和读取消息。
  • 收到消息后,在处理期间它会变为“锁定”状态。这可防止其他计算机同时处理该消息。如果消息处理失败,锁定会过期,而消息也重新变为可用。如果应用程序需要更多处理时间,则可通过 ChangeMessageVisibility 操作动态更改“锁定”超时。
  • 开发人员可以匿名或使用特定 AWS 账户安全分享 Amazon SQS 队列。队列共享还可按 IP 地址和一天中的时刻进行限制。
  • 新增!服务器端加密 (SSE) 使用由 AWS Key Management Service (AWS KMS) 托管的密钥来保护 Amazon SQS 队列中的消息内容。SSE 会在 Amazon SQS 收到消息后立即进行加密。消息以加密形式存储,并且只有将消息发送到授权使用者时 Amazon SQS 才会解密消息。
  • Amazon Simple Notification Service (SNS) 配合使用时,开发人员可以将相同的消息“扇出”到多个标准 SQS 队列。借助扇出,发布到 SNS 主题的消息可分配到大量并行的 SQS 标准队列中。使用扇出,开发人员可以构建充分利用并行、异步处理的应用程序。例如,每次上传新的图像时,开发人员都可以向相应主题发布一条消息。独立进程 (独立队列的每次读取) 可以生成缩略图、执行图像识别并存储关于图像的元数据。SNS 目前不支持 FIFO 排序,也不支持像这样扇出到 FIFO 队列。
  • 开发人员可以使用死信队列来处理阻塞消息(使用者未成功处理的消息)。当超出消息的最大接收数时,消息将会移动到与原队列相关的死信队列 (DLQ) 中。开发人员可为 DLQ 设置单独的用户进程,以便帮助分析和理解消息为何会阻塞。DLQ 的类型必须与来源队列 (标准队列或 FIFO 队列) 相同。

Amazon SQS 消息队列可以和其他 AWS 产品一起使用,例如 RedshiftDynamoDBRDSEC2ECSLambdaS3,从而让分布式应用程序更可靠、可扩展性更强。以下是一些常见的设计模式:

  • 工作队列:分离分布式应用程序的组件,这些组件可能没有同时处理同样的工作量。
  • 缓冲和批操作:增加您的架构的可扩展性和可靠性,在平滑处理临时容量峰值的同时不丢失消息或增加延迟。
  • 请求卸载:通过排列请求的方式,将慢操作从互动请求中移除。
  • 扇出合并 SQS 和 Simple Notification Service (SNS),将消息的相同副本发送给多个并行队列。
  • 优先级:使用独立队列提供工作的优先处理顺序。
  • 可扩展性:消息队列会分离您的流程,因此纵向扩展消息的发送或接收速率十分简单,只需添加其他流程即可。
  • 弹性:当您部分系统出现故障时,无需替换整个系统。消息队列会分离系统组件,因此如果某个从队列中读取消息的流程出现故障,那么在系统恢复后仍然可以将消息添加到该队列进行处理。

本服务遵循 Amazon Web 服务客户协议