开始免费使用 AWS

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

AWS 免费套餐包括通过 Amazon ElastiCache 提供的 750 小时的微缓存节点。

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

问:什么是 Amazon SQS?

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

Amazon SQS 可以提供可靠并且高度可扩展的托管队列,用于存储在计算机之间传输的消息。借助 Amazon SQS,您可以在不同的分布式应用程序组件之间移动数据,同时既不会丢失消息,也不需要各个组件始终处于可用状态。

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

问:Amazon SQS 有哪些功能?

由于 Amazon SQS 高度可扩展,您可以按使用量付费。您可以从较小规模开始,然后随着业务需要逐步扩大应用程序的规模,而不会牺牲性能或可靠性。借助 Amazon SQS,您可以专注于构建稳健而复杂的基于消息的应用程序,不必再担心消息的存储和管理问题。

某些具体用途如下:

  • 将 Amazon SQS 与其他 AWS 服务集成,让应用程序更加灵活、更加可靠。
  • 使用 Amazon SQS 创建工作队列,其中每条消息都是一项等待处理的任务。让一台或多台计算机从消息队列中读取任务然后加以处理。
  • 构建微服务架构并使用消息队列来连接微服务。
  • 将重要业务事件的通知保存在 Amazon SQS 消息队列中。每个事件在消息队列中均有一条对应的消息,需要知晓该事件的应用程序可以读取和处理对应的消息。

问:如何开始使用 Amazon SQS?

您可以完成我们的 10 分钟教程在分布式应用程序之间发送消息,通过几个步骤创建 Amazon SQS 队列并发送消息。

有关更多详情,请参阅 Amazon SQS 开发人员指南资源中心内的示例代码

问:Amazon SQS 相对于自主或打包式消息队列系统有哪些优势?

自行构建软件来管理消息队列或者使用商用或开源消息队列系统在前期需要花费大量的时间进行开发和配置,与其相比,使用 Amazon SQS 具有若干优势。

其他方案需要持续进行硬件维护,并会占用系统管理资源。如果需要冗余消息存储以确保在出现硬件故障时不会丢失消息,那么这些系统的配置和管理将更为复杂。

相反,Amazon SQS 不需要管理开销,而且基本不需要配置。Amazon SQS 可以大规模处理工作,每天处理数十亿条消息。您可以在不进行任何配置的情况下增加或减少向 Amazon SQS 发送的流量。此外,Amazon SQS 还可以实现极高的消息持久性,让您和您的利益相关者更加放心。

问:Amazon SQS 与 Amazon SNS 有何不同?

Amazon Simple Queue Service (SQS) 和 Amazon SNS 都是 AWS 中的消息收发服务,但为开发人员提供了不同的优势。Amazon SNS 允许应用程序通过“推送”机制向多个订阅者发送时间关键型消息,并且无需定期检查或“轮询”更新。Amazon SQS 是供分布式应用程序使用的消息队列服务,它通过轮询模式交换消息,可用于解耦收发组件。Amazon SQS 使分布式应用程序组件可以灵活地收发消息,并且不要求每个组件同时可用。

一种常见的模式是使用 SNS 将消息发布到 Amazon SQS 队列,进而以可靠的方式将消息异步发送到一个或多个系统组件。有关更多详情,请参阅什么是 Pub/Sub 消息收发?

问:Amazon SQS 与 Amazon MQ 有何不同?

Amazon MQ、Amazon SQS 和 Amazon SNS 都是消息收发服务,适用于从初创公司到大型企业的任何规模的企业。如果您正在使用现有应用程序中的消息收发功能,想要快速轻松地将消息收发功能移至云中,我们建议您考虑使用 Amazon MQ。它支持行业标准 API 和协议,因此,您可以从任何基于标准的消息代理切换到 Amazon MQ,且无需重新编写您应用程序中的消息收发代码。如果您要在云中构建全新的应用程序,我们建议您考虑使用 Amazon SQS 和 Amazon SNS。Amazon SQS 和 SNS 是轻型的、完全托管的消息队列和主题服务,可以几乎无限地进行扩展,并可提供易于使用的简单 API。您可以使用 Amazon SQS 和 SNS 分离和扩展微服务、分布式系统和无服务器应用程序,以及提高可靠性。

问:Amazon SQS 是否提供消息排序功能?

是的。FIFO (先进先出) 队列可准确保持消息的发送和接收顺序。如果您使用 FIFO 队列,就无需在消息中加入排队信息。有关更多信息,请参阅 Amazon SQS 开发人员指南中的 FIFO 队列逻辑

标准队列提供宽松的 FIFO 功能,会尽可能保持消息顺序。但是,由于标准队列使用高度分布式架构来实现大规模扩展,因此并不能确保接收消息时严格遵循消息发送的顺序。

问:Amazon SQS 是否能确保传送消息?

标准队列提供至少一次传送,因此每条消息至少会传送一次。

FIFO 队列提供严格一次处理,因此每条消息仅传送一次,并且在使用器处理并删除它之前始终可用。队列本身不会引入重复消息。

 

问:Amazon SQS 与 Amazon Kinesis Streams 有何不同?

Amazon SQS 提供高度可扩展的可靠托管队列,用于存储在应用程序或微服务之间传送的消息。它在分布式应用程序组件之间传送数据,可帮助您解耦这些组件。Amazon SQS 提供通用的中间件结构,例如死信队列和毒丸管理。它还提供通用型 Web 服务 API,并且可以通过 AWS SDK 所支持的任何编程语言访问。Amazon SQS 支持标准队列和 FIFO 队列。

当您要求每条消息仅被使用一次或者遇到以下情形时,请使用 Amazon SQS:

  • 解耦一个应用程序的多个组件:您有一个工作项队列,并且希望单独跟踪每个工作项是否成功完成。Amazon SQS 会跟踪 ACK/FAIL 结果,因此应用程序无需保留持续的检查点或光标。在配置好的可见性超时之后,Amazon SQS 将删除确认的消息并重新传送失败的消息。
  • 配置单独的消息延迟:您有一个作业队列,并需要给某些作业单独安排一定的延迟。通过 Amazon SQS,您可为某些消息单独配置最多 15 分钟的延迟。
  • 在读取时动态提升并发度或吞吐量:您有一个工作队列,并希望在清空积压之前增加更多读取器。通过 Amazon Kinesis Streams,您可以扩展到足够数量的分区 (但请注意,您必须提前预置足够的分区)。Amazon SQS 不需要提前预置。
  • 透明扩展:由于业务偶尔出现负载尖峰或自然增长,您需要缓冲请求和负载变化。由于 Amazon SQS 可以单独处理每个缓冲的请求,Amazon SQS 可以透明扩展以处理负载,而无需您发出任何预置指令。

Amazon Kinesis Streams 允许实时处理流式大数据,还能够读取记录并重播至多个 Amazon Kinesis 应用程序。Amazon Kinesis 客户端库 (KCL) 能够将给定分区键的所有记录提供给同一记录处理器,从而可支持更加轻松地构建从同一 Amazon Kinesis 数据流读取数据的多个应用程序 (例如,执行计数、聚合和筛选)。

当您希望多个使用器能够同时处理每条记录或者遇到以下情形时,请使用 Amazon Kinesis Streams:

  • 将相关记录路由至同一个记录处理器:您对 MapReduce 执行流处理。当给定键的所有记录被传输到同一记录处理器时,计数和聚合等操作更加简单。
  • 允许多个应用程序并发使用同一个数据流:有一个应用程序需要更新实时控制面板,另一个应用程序需要将数据归档至 Amazon Redshift。您希望这两个应用程序并行独立地使用同一数据流的数据。

问:Amazon 在自己的应用程序中是否使用 Amazon SQS?

是。Amazon 的开发人员将 Amazon SQS 用于每天处理大量消息的各种应用程序。Amazon.com 和 Amazon Web Services 中的关键业务流程均使用 Amazon SQS。


问:Amazon SQS 的费用是多少?

您只需按实际用量付费,而且没有最低费用。

Amazon SQS 的费用按请求数计算,再加上从 Amazon SQS 传出数据的数据传输费 (传输到同一区域内的 Amazon EC2 实例或 AWS Lambda 函数的数据除外)。有关各队列类型和区域的详细定价明细,请参阅 Amazon SQS 定价

问:Amazon SQS 免费套餐可以用来做些什么?

Amazon SQS 免费套餐每月免费提供 100 万个请求。

许多小规模应用程序都能在免费套餐的限制范围内完整地运行。但您可能仍然需要支付数据传输费用。有关更多信息,请参阅 Amazon SQS 定价

免费套餐是按月优惠的,免费使用量不能跨月累计。

问:是否所有 Amazon SQS 请求均需要收费?

是的,超出免费套餐的任何请求均需要收费。所有 Amazon SQS 请求均需要收费,并且按同一费率计费。

问:与其他请求相比,Amazon SQS 批量操作的费用是否更高?

不是。批量操作 (SendMessageBatch、DeleteMessageBatch 和 ChangeMessageVisibilityBatch) 的费用与其他 Amazon SQS 请求的费用相同。您可以通过将消息分批来降低 Amazon SQS 费用。

问:使用 Amazon SQS 要如何收费和计费?

开始使用 Amazon SQS 时,没有初始费用。我们会在每个月底自动从您的信用卡中收取当月使用费。

您可以随时在 AWS 网站上查看当前账单期的费用:

  1. 登录 AWS 账户。
  2. Your Web Services Account 下,选择 Account Activity

问:如何跟踪和管理与 Amazon SQS 队列相关的成本?

您可以使用成本分配标签来标记和跟踪您的队列,以进行资源和成本管理。标签是由键值对组成的元数据标签。例如,您可以按成本中心标记您的队列,然后根据这些成本中心对成本进行分类和跟踪。

有关更多信息,请参阅 Amazon SQS 开发人员指南中的“标记 Amazon SQS 队列”。有关 AWS 资源成本分配标记的更多信息,请参阅 AWS 账单和成本管理用户指南中的使用成本分配标签

问:价格是否含税?

除非另行说明,否则我们的价格不包括任何适用的税费 (例如增值税和适用的销售税)。

账单地址为日本地址的客户使用任何区域的 AWS 均需承担日本消费税。有关更多信息,请参阅 Amazon Web Services 消费税常见问题


问:是否可以将 Amazon SQS 与其他 AWS 服务结合使用?

可以。您可以将 Amazon SQS 与 Amazon EC2、Amazon EC2 Container Service (Amazon ECS) 和 AWS Lambda 等计算服务以及 Amazon Simple Storage Service (Amazon S3) 和 Amazon DynamoDB 等存储和数据库服务结合使用,从而让应用程序具有更高的灵活性和可扩展性。

分离的分布式应用程序就是一种常见的使用案例。其中多个组件或模块需要互相通信,但不能同时处理相同数量的工作。在这种情况下,Amazon SQS 消息队列可以承载消息,供 Amazon EC2 实例上运行的应用程序进行处理。

Amazon EC2 实例可以读取消息队列、处理任务,然后将结果作为消息发布到另一 Amazon SQS 消息队列(可能由其他应用程序进行进一步处理)。由于 Amazon EC2 允许应用程序动态扩展和缩减,因此应用程序开发人员可以根据 SQS 队列中的消息量,使用 Auto Scaling 改变计算实例的数量,确保任务得以及时处理。

问:能否举例介绍一个 Amazon SQS 的使用案例?

下面介绍了一家视频转码网站如何将 Amazon EC2、Amazon SQS、Amazon S3 和 Amazon DynamoDB 搭配使用。

  1. 终端用户将需要转码的视频提交到网站。
  2. 视频存储到 Amazon S3 中,一条请求消息则排入 Amazon SQS 传入队列,消息中包含了指向视频和目标视频格式的指针。
  3. 在一组 Amazon EC2 实例上运行的转码引擎从传入队列中读取请求消息,使用其中的指针从 Amazon S3 中检索视频,并将视频转码为目标格式。
  4. 转换后视频放回到 Amazon S3 中,另一条回复消息排入另一个 Amazon SQS 传出队列,其中包含了指向转换后视频的指针。
  5. 同时,关于视频的元数据(格式、创建日期、长度等)被索引到 Amazon DynamoDB 中以便查询。

在此工作流程中,一个专用的 Auto Scaling 实例会持续监控传入队列。该 Auto Scaling 实例会根据传入队列中的消息数量动态调整转码 Amazon EC2 实例的数量,以便满足网站客户对响应时间的要求。

问:如何与 Amazon SQS 交互?

您可以使用 AWS 管理控制台来访问 Amazon SQS,该控制台可帮助您轻松地创建 Amazon SQS 队列和发送消息。

Amazon SQS 还提供 Web 服务 API。并且,它还集成至 AWS SDK 中,这使您能够根据需要选择编程语言。

问:消息队列有哪些可用操作?

有关消息队列操作的更多消息,请参阅 Amazon SQS 产品详细信息

问:谁可以对消息队列执行操作?

只有 AWS 账户拥有者(或账户拥有者指派的 AWS 账户)可以在 Amazon SQS 消息队列上执行操作。

问:是否可以将 Java Message Service (JMS) 与 Amazon SQS 结合使用?

可以。您可以享受 Amazon SQS 的规模、低成本和高可用性,而不必担心运行自己的 JMS 集群的开销。

Amazon 提供的 Amazon SQS Java Messaging Library 采用 JMS 1.1 规范,并将 Amazon SQS 用作 JMS 提供者。有关更多信息,请参阅 Amazon SQS 开发人员指南中的结合使用 JMS 和 Amazon SQS

问:Amazon SQS 如何识别消息?

所有消息都带有一个全局唯一的 ID,Amazon SQS 会在消息传送到消息队列时返回该 ID。对消息执行任何进一步操作均不需要使用该 ID,但它可用于跟踪是否收到消息队列中的某一特定消息。

当您从消息队列接收消息时,回复中包含一个接收句柄,删除消息时必须提供该句柄。

问:Amazon SQS 如何处理未能成功处理的消息?

在 Amazon SQS 中,您可以使用 API 或控制台来配置死信队列,用于从其他源队列接收消息。

如果将某个队列设为死信队列,则当消息经过最大处理次数且未能完成时,该队列就会接收该消息。您可以使用死信队列隔离无法处理的消息,以备将来分析。

有关更多信息,请参阅本页上的“死信队列是否能与 FIFO 结合使用?”以及 Amazon SQS 开发人员指南中的使用 Amazon SQS 死信队列

问:什么是可见性超时?

可见性超时是一个时段,在这个时段内,Amazon SQS 会阻止其他处理组件接收和处理某条消息。有关更多信息,请参阅 Amazon SQS 开发人员指南中的可见性超时

问:Amazon SQS 如何允许多个读取者访问同一消息队列,而不会丢失消息或重复处理消息?

每个 Amazon SQS 队列都具有可配置的可见性超时。当系统从队列中读取一条消息时,任何其他读取者在指定时间都看不到该消息。只要消息的处理时间短于可见性超时,则每条消息就都会得以处理并被删除。

如果处理消息的组件出现故障或不可用,那么可见性超时结束后,读取消息队列的任何组件就可以再次看到该消息。这可以让多个组件从同一消息队列中读取消息,并且每个组件负责处理不同的消息。

问:消息最长可见性超时时间是多少?

Amazon SQS 消息的最长可见性超时时间为 12 小时。

问:Amazon SQS 是否支持消息元数据?

是的。一条 Amazon SQS 消息最多包含 10 项元数据属性。您可以使用消息属性将消息正文与描述该消息的元数据分离开来。这有助于系统更加快速、高效地处理和存储信息,因为您的应用程序不需要检查整条消息即可了解如何处理。

Amazon SQS 消息属性采用“名称-类型-值”这种由三项元素构成的格式。支持的类型包括字符串、二进制和数字(包括整数、浮点数和双数)。有关更多信息,请参阅 Amazon SQS 开发人员指南中的使用 Amazon SQS 消息属性

问:如何确定排队时间值?

要确定排队时间值,您可以在接收消息时请求提供 SentTimestamp 属性。将当前时间减去该值即可得出排队时间值。

问:Amazon SQS 的典型延迟是多少?

SendMessage、ReceiveMessage 和 DeleteMessage API 请求的典型延迟是几十毫秒或一百到两百毫秒。

问:在匿名访问时,消息的 SenderId 属性值是什么?

在 AWS 账户 ID 不可用(例如匿名用户发送消息)时,Amazon SQS 将提供 IP 地址。

问:什么是 Amazon SQS 长轮询?

Amazon SQS 长轮询是从 Amazon SQS 队列中检索消息的一种方式。常规的短轮询会立即返回响应,即使轮询的消息队列为空;而长轮询只有在消息进入消息队列或长轮询超时时才返回响应。

如果要从 Amazon SQS 队列中检索暂时不可用的消息,那么长轮询是一种成本较低的方式。因为您可以减少接收空消息的次数,所以使用长轮询可以降低 SQS 的使用成本。有关更多信息,请参阅 Amazon SQS 开发人员指南中的 Amazon SQS 长轮询

问:使用 Amazon SQS 长轮询是否会收取其他费用?

不会。长轮询 ReceiveMessage 调用的计费方式与短轮询 ReceiveMessage 调用的计费方式完全相同。

问:什么时候应该使用 Amazon SQS 长轮询?什么时候应该使用 Amazon SQS 短轮询?

几乎在所有情况下,使用 Amazon SQS 长轮询都比使用短轮询更好。长轮询请求可以让使用队列的应用程序在消息进入队列后接收消息,同时减少返回的空 ReceiveMessageResponse 实例的数量。

Amazon SQS 长轮询在大多数使用案例中的效果都更好,成本也更低。但是,如果您的应用程序希望从 ReceiveMessage 调用中获得即时响应,则可能需要对应用程序进行一些修改才能利用长轮询的优势。

例如,如果您的应用程序使用单个线程来轮询多个队列,那么短轮询可能无法切换为长轮询,因为单个线程会等待所有空队列的长轮询超时,从而导致延迟处理可能包含消息的任何队列。

在这种应用程序中,建议使用单个线程来处理一个队列,从而使应用程序能够利用 Amazon SQS 长轮询的优势。

问:长轮询超时应使用什么值?

通常,长轮询超时最多为 20 秒。较高的长轮询超时值会减少返回的空 ReceiveMessageResponse 实例的数量,因此,请将长轮询超时值设置为尽可能高的值。

如果 20 秒的最大值不适用于您的应用程序(请参阅上一问题中的示例),则您可以设置较短的长轮询超时,最短为 1 秒。

默认情况下,所有 AWS 开发工具包都支持 20 秒的长轮询。如果您未使用 AWS 开发工具包访问 Amazon SQS,或者您将 AWS 开发工具包特别配置为使用较短的超时,则您可能需要修改您的 Amazon SQS 客户端,才能允许时间更长的请求或者使用较短的长轮询超时。

问:什么是适用于 Java 的AmazonSQSBufferedAsyncClient?

适用于 Java 的 AmazonSQSBufferedAsyncClient 可以让用户使用 AmazonSQSAsyncClient 接口,并添加了几项重要功能:

  • 自动批处理多个 SendMessage、DeleteMessage 或 ChangeMessageVisibility 请求,而无需对应用程序进行任何更改
  • 将消息预取到本地缓冲区,让您的应用程序可以立即处理来自 Amazon SQS 的消息,无需等待检索消息

自动批处理和预取功能结合到一起以后,可以提高吞吐量并降低应用程序延迟,并且提交的 Amazon SQS 请求更少,从而节省成本。有关更多信息,请参阅 Amazon SQS 开发人员指南中的客户端缓冲和请求批处理

Amazon SQS Buffered Asynchronous Client 目前不支持 FIFO 队列。

问:从哪里下载适用于 Java 的 AmazonSQSBufferedAsyncClient?

您可以下载适用于 Java 的 AWS 开发工具包,其中就包含适用于 Java 的 AmazonSQSBufferedAsyncClient。

问:是否需要重新编写应用程序才能使用适用于 Java 的 AmazonSQSBufferedAsyncClient?

不需要。适用于 Java 的 AmazonSQSBufferedAsyncClient 用于替换现有的 AmazonSQSAsyncClient。

您可以通过更新应用程序来使用最新 AWS 开发工具包,并通过更改客户端来用适用于 Java 的 AmazonSQSBufferedAsyncClient 替换 AmazonSQSAsyncClient,这样,您的应用程序就能获得自动批处理和预取功能所带来的新优势。

问:如何让 Amazon SQS 消息队列接收来自 Amazon SNS 主题的通知?

  1. 在 Amazon SQS 控制台中,选择一个 Amazon SQS 标准队列。
  2. Queue Actions 下,从下拉列表中选择 Subscribe Queue to SNS Topic
  3. 在对话框中,从 Choose a Topic 下拉列表中选择主题,然后单击 Subscribe

有关更多信息,请参阅 Amazon SQS 开发人员指南中的为队列订阅 Amazon SNS 主题

问:如何将相同的消息群发到多个 Amazon SQS 队列?

  1. 使用 Amazon SNS 创建一个主题。
  2. 创建多个 Amazon SQS 标准队列并为其订阅该 Amazon SNS 主题。
  3. 发送到 Amazon SNS 主题的所有消息都会被群发到 Amazon SQS 消息队列。

Amazon SNS 会将消息发送到订阅该主题的所有 Amazon SQS 消息队列。

问:Amazon SNS 是否确保将消息向 Amazon SQS 队列至少传送一次?

Amazon SNS 之所以这样设计是为了将每条消息向 Amazon SQS 标准队列至少传送一次。

问:能否删除消息队列中的所有消息而保留消息队列?

可以。您可以使用 PurgeQueue 操作删除 Amazon SQS 消息队列中的所有消息。

当您清除消息队列时,之前发送到该消息队列的所有消息都将被删除。因为您的消息队列及其属性将会保留,所以不需要重新配置消息队列;您可以继续使用。

如果只想删除特定的消息,可以使用 DeleteMessage 或 DeleteMessageBatch 操作。


问:标准队列FIFO 队列有何不同?

标准队列

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

sqs-what-is-sqs-standard-queue-diagram

只要应用程序能够处理多次传送和不按顺序传送的消息,就会有多种场景可以使用标准消息队列,例如:

  • 将实时用户请求从密集的后台工作中解耦:让用户在调整媒体大小或对媒体编码时上传媒体。
  • 将任务分配给多个工作程序节点:处理大量信用卡验证请求。
  • 将消息分批以便进一步处理:计划要添加到数据库的多个条目。

FIFO 队列

此队列类型最重要的功能是 FIFO (先进先出) 传送一次性处理:让消息的发送顺序和接收顺序严格保持一致,且消息只传递一次并在使用者处理和删除它之前保持可用;重复的消息不会被引入队列。FIFO 队列还允许一个队列中出现多个有序的消息组。FIFO 队列的上限是 300 个事务/秒 (TPS),但具有标准队列的全部功能。

sqs-what-is-sqs-fifo-queue-diagram



当操作或事件的顺序至关重要或者不能容忍重复消息时,即可使用 FIFO 队列来加强应用程序之间的消息传送,例如:

  • 确保按正确的顺序执行用户输入的命令。
  • 通过按正确的顺序发送价格修改来显示正确的产品价格。
  • 防止学员在注册账户之前参加课程。

问:哪些地区提供 FIFO 队列?

目前,美国西部 (俄勒冈)、美国东部 (俄亥俄)、美国东部 (弗吉尼亚北部) 和欧洲 (爱尔兰) 地区均提供 FIFO 队列。此功能将于未来几个月在更多地区推出,敬请期待。

问:我会收到一条消息的多少副本?

FIFO 队列的设计宗旨是不引入重复消息。但是,在某些情况下,消息创建器可能会引入重复消息:例如,如果创建器发送一条消息,未收到响应,然后又重发了同一条消息。Amazon SQS API 提供重复数据删除功能,可防止消息创建器发送重复消息。由消息创建器引入的任何重复消息都会在 5 分钟重复数据删除时间间隔内被删除。

对于标准队列,您可能偶尔会收到一条消息的重复副本 (至少一次传送)。如果您使用标准队列,则必须将应用程序设计为幂等应用程序 (也就是说,应用程序即使多次处理同一条消息也不会受到不利影响)。

问:我以前使用的 Amazon SQS 队列会不会转变为 FIFO 队列?

不会。Amazon SQS 标准队列 (现有队列的新名称) 保持不变,您仍然可以创建标准队列。这些队列仍会继续提供最高的可扩展性和吞吐量,但不会再保证顺序不变,而且可能会出现重复消息。

标准队列适合很多场景,例如在多个幂等使用器之间进行工作分配。

问:我是否能将现有的标准队列转换为 FIFO 队列?

不能。您必须在创建队列时选择队列类型。 但可以转移到 FIFO 队列。有关更多信息,请参阅 Amazon SQS 开发人员指南中的从标准队列转移到 FIFO 队列

问:Amazon SQS FIFO 队列是否向后兼容?

要利用 FIFO 队列功能,您必须使用最新的 AWS SDK。

FIFO 队列与标准队列使用相同的 API 操作,接收和删除消息以及更改可见性超时的机制也相同。但是,在发送消息时,您必须指定消息组 ID。有关更多信息,请参阅 Amazon SQS 开发人员指南中的 FIFO 队列逻辑

重要说明:不能将现有的标准队列转换为 FIFO 队列。要实现转移,您必须为应用程序创建新的 FIFO 队列,或者删除现有的标准队列并重新将其创建为 FIFO 队列。有关更多信息,请参阅 Amazon SQS 开发人员指南中的从标准队列转移到 FIFO 队列

问:Amazon SQS FIFO 队列可与哪些 AWS 服务或外部服务兼容?

向 Amazon SQS 发送通知的有些 AWS 服务或外部服务无法与 FIFO 队列兼容,除非允许您将 FIFO 队列设置为目标。

AWS 服务的以下功能目前无法与 FIFO 队列兼容:

有关其他服务与 FIFO 队列的兼容性信息,请参阅您的服务文档。

问:Amazon SQS FIFO 队列是否与 Amazon SQS Buffered Asynchronous Client、Amazon SQS Extended Client Library for Java 或 Amazon SQS Java Message Service (JMS) Client 兼容?

FIFO 队列目前不与 Amazon SQS Buffered Asynchronous Client 兼容。

FIFO 队列与 Amazon SQS Extended Client Library for Java 和 Amazon SQS Java Message Service (JMS) Client 兼容。

问:Amazon SQS FIFO 队列支持哪些 AWS CloudWatch 指标?

标准队列支持的所有队列,FIFO 队列也都支持。对于 FIFO 队列,所有 approximate 指标都会返回准确的计数。例如,支持以下 AWS CloudWatch 指标:

  • ApproximateNumberOfMessagesDelayed – 队列中延迟且无法立即读取的消息数量。
  • ApproximateNumberOfMessagesVisible – 可从队列检索的消息数量。
  • ApproximateNumberOfMessagesNotVisible – 处于飞行状态的消息数量 (已发送给客户端,但尚未被删除或尚未超过可见性时间范围)。

问:什么是消息组?

在 FIFO 队列中,消息被组合成有序的不同“捆绑包”。对于每一个消息组 ID,所有消息的发送和接收均严格遵循一定的顺序。但是,具有不同消息组 ID 值的消息在发送和接收时可能会不按顺序。必须为消息关联消息组 ID。如果不提供消息组 ID,操作就会失败。

如果多个主机 (或同一主机上的不同线程) 向 FIFO 队列中发送了具有相同消息组 ID 的消息,则 Amazon SQS 按照它们到达的顺序来传送消息。为确保 Amazon SQS 在发送和接收消息时保持相同顺序,请确保多个发送者发送每一条消息时均具有唯一的消息组 ID。 

问:Amazon SQS FIFO 队列是否支持多个创建器?

支持。一个或多个创建器可以向一个 FIFO 队列发送消息。消息按 Amazon SQS 成功接收到它们时的顺序存储。

如果多个创建器并行发送消息,而不等待来自 SendMessage 或 SendMessageBatch 操作的成功响应,则创建器之间的顺序可能不会保留。SendMessage 或 SendMessageBatch 操作的响应包含 FIFO 队列用于将消息放到队列中的最终顺序,因此您的并行多创建器代码可以确定消息在队列中的最终顺序。

问:Amazon SQS FIFO 队列是否支持多个使用器?

根据设计,Amazon SQS FIFO 队列不能一次将同一消息组中的消息提供给多个使用者。但是,如果您的 FIFO 队列具有多个消息组,则您可以利用并行使用者,以便 Amazon SQS 将不同消息组中的消息提供给不同的使用者。

问:死信队列是否能与 FIFO 结合使用?

可以。但必须将 FIFO 死信队列与 FIFO 队列结合使用。(同样,只能将标准死信队列与标准队列结合使用。)

问:Amazon SQS FIFO 队列的吞吐量上限是多少?

如果不使用批处理,FIFO 队列每秒最多可以支持 300 条消息 (每秒执行 300 个发送、接收或者删除消息的操作)。如果您利用最大批处理能力 (每个操作 10 条消息),则 FIFO 队列每秒最多可以支持 3000 条消息。Amazon SQS 标准队列拥有无限吞吐量。

问:是否有任何特定于 FIFO 队列属性的限制?

FIFO 队列的名称必须以 .fifo 后缀结尾。80 个字符的队列名称限制包含后缀。要确定队列是否为 FIFO 队列,您可以检查队列名称是否以该后缀结尾。


问:在 Amazon SQS 中存储数据的可靠性如何?

Amazon SQS 将所有消息队列和消息都存储在具有多个冗余可用区 (AZ) 并且高度可用的单个 AWS 区域中,因此,一台计算机、一个网络或一个可用区的故障不会导致消息无法访问。有关更多信息,请参阅 Amazon Relational Database Service 用户指南中的区域和可用区

问:如何保护消息队列中的消息?

身份验证机制可以确保存储在 Amazon SQS 消息队列中的消息不会受到未经授权的访问。您可以控制谁能向消息队列发送消息以及谁能从消息队列接收消息。如需提高安全性,您可以构建应用程序将消息加密,然后再将其放入消息队列。

Amazon SQS 带有基于资源的权限系统,所用策略的编写语言与 AWS Identity and Access Management (IAM) 策略的编写语言相同。举例来说,您可以像在 IAM 策略中一样使用变量。有关更多信息,请参阅 Amazon SQS 开发人员指南中的 Amazon SQS 策略示例

Amazon SQS 支持 HTTP over SSL (HTTPS) 协议以及传输层安全性 (TLS) 协议。大多数客户端可自动协商使用新版本 TLS 协议,无需更改任何代码或配置。Amazon SQS 在所有区域中都支持 1.0、1.1 和 1.2 版传输层安全性 (TLS) 协议。

问:为什么会有单独的 ReceiveMessage 和 DeleteMessage 操作?

当 Amazon SQS 返回消息给您时,无论您实际上是否收到消息,该消息都会保存在消息队列中。您负责删除消息,而且发送删除请求即表明您已处理了该消息。

如果您不删除消息,则 Amazon SQS 会在收到另一个接收请求时传送该消息。有关更多信息,请参阅 Amazon SQS 开发人员指南中的可见性超时

问:删除的消息能否被再次接收?

不能。FIFO 队列绝不会引入重复消息。

对于标准队列,在极少的情况下,您可能会再次收到之前删除的消息。如果分布式 Amazon SQS 系统中的某台服务器在执行删除时不可用,DeleteMessage 操作就无法删除消息的所有副本。在这种情况下,您可能会再次收到之前删除的消息,但这种情况非常少见。该消息副本可能会被再次传送。如果您使用标准队列,请将应用程序设计为幂等应用程序 (也就是说,即使您再次收到已删除的消息也不会出现错误或不一致)。

问:如果对之前已删除的消息发出 DeleteMessage 请求,结果会怎样?

如果对之前已删除的消息发出 DeleteMessage 请求,Amazon SQS 会返回一个响应,表明删除成功


问:Amazon SQS 的服务器端加密 (SSE)有哪些优势?

借助服务器端加密 (SSE),您可以采用加密队列的方式传输敏感数据。SSE 会使用 AWS Key Management Service (AWS KMS) 托管的密钥保护 Amazon SQS 队列中的消息内容。只要 Amazon SQS 收到消息,SSE 就会对其进行加密。这些消息以加密的形式进行存储,且仅当它们发送到授权的客户时,Amazon SQS 才会对其进行解密。

AWS KMS 将安全、高度可用的硬件和软件结合起来,提供可扩展到云的密钥管理系统。

使用 AWS KMS 具有以下优势:

  • 您自己可以创建和管理客户主密钥 (CMK)
  • 您还可以将 AWS 托管的 CMK 与 Amazon SQS 相结合使用,每个账户和地区都具有唯一的 CMK。 
  • AWS KMS 安全标准可帮助您满足加密相关的合规性要求。

有关详细信息,请参阅以下资源:

问:哪些地区提供含 SSE 的队列?

美国东部 (弗吉尼亚北部和俄亥俄) 和美国西部 (俄勒冈) 地区提供适用于 Amazon SQS 的 SSE。此功能将于未来几个月在更多地区推出,敬请期待。

问:如何为新的或现有 Amazon SQS 队列启动 SSE?

要为使用 Amazon SQS API 的新的或现有 Amazon SQS 队列启动 SSE,可通过设置 CreateQueue 或 SetQueueAttributes 操作的 KmsMasterKeyId 属性,来指定客户主密钥 (CMK) ID:AWS 托管的 CMK 或自定义 CMK 的别名、别名 ARN、密钥 ID 或密钥 ARN。

有关详细说明,请参阅 Amazon SQS 开发人员指南中的创建采用客户端加密的 Amazon SQS 队列为现有 Amazon SQS 队列配置服务器端加密 (SSE)

问:哪些类型的 Amazon SQS 队列可以使用 SSE?

标准队列和 FIFO 队列均支持 SSE。

问:对 Amazon SQS 使用 SSE 时,需要什么权限?

您必须先将 AWS KMS 密钥策略配置为允许加密队列以及允许加密和解密消息,然后才能够使用 SSE。

要为队列启用 SSE,您可以使用由 AWS 托管且适用于 Amazon SQS 的客户主密钥 (CMK),也可以使用自定义 CMK。有关更多信息,请参阅 AWS KMS 开发人员指南中的客户主密钥

要向加密的队列发送消息,生产者必须拥有 CMK 的 kms:GenerateDataKey 和 kms:Decrypt 权限。

要从加密的队列接收消息,消费者必须拥有用于加密指定队列中的消息的任何 CMK 的 kms:Decrypt 权限。如果队列充当的是死信队列,消费者还必须拥有用于加密源队列中的消息的任何 CMK 的 kms:Decrypt 权限。

有关更多信息,请参阅《Amazon SQS 开发人员指南》中的“对 Amazon SQS 使用 SSE 时,需要什么权限?”

问:对 Amazon SQS 使用 SSE 时,需要支付费用吗?

无需支付其他任何 Amazon SQS 费用。但是,从 Amazon SQS 到 AWS KMS 之间的调用会产生费用。有关更多信息,请参阅 AWS Key Management Service 定价

使用 AWS KMS 所产生的费用取决于您为队列配置的数据密钥重用周期。有关更多信息,请参阅《Amazon SQS 开发人员指南》中的“如何估算 AWS KMS 的使用费用?”

问:适用于 Amazon SQS 的 SSE 会加密哪些内容以及如何加密?

SSE 会加密 Amazon SQS 队列中消息的主体。

SSE 不会加密以下部分:

  • 队列元数据 (队列名称和属性)
  • 消息元数据 (消息 ID、时间戳和属性)
  • 每个队列的指标

Amazon SQS 根据由 AWS 托管且适用于 Amazon SQS 的客户主密钥 (CMK) 或自定义 CMK 生成数据密钥,以便为可配置的时间段 (从 1 分钟到 24 小时) 提供信封加密和消息解密。

问:适用于 Amazon SQS 的 SSE 采用什么算法来加密消息?

SSE 使用 AES-GCM 256 算法

问:SSE 会干扰 Amazon SQS 的运行吗?

对消息进行加密,将使未授权或匿名用户无法使用其内容。对消息进行加密不会影响 Amazon SQS 的正常运行:

  • 仅当消息在启用队列的加密之后发送,才会对其进行加密。Amazon SQS 不会加密已积压的消息。
  • 即使任何已加密消息的队列的加密已被禁用,此类消息仍保持加密状态。

问:已加密的 Amazon SQS 队列如何与未加密的队列和死信队列共存?

将消息移至死信队列不会影响其加密状态:

  • 如果将某个消息从已加密的源队列移至未加密的死信队列,此消息仍保持加密状态。
  • 如果某个消息从未加密的源队列移至已加密的死信队列,此消息仍保持未加密状态。

问:SSE 是否会限制可使用 Amazon SQS 创建的每秒事务数 (TPS) 或队列数?

SSE 不会限制 Amazon SQS 的吞吐量 (TPS)。您可以创建的 SSE 队列数受以下项限制:

  • 数据密钥重用周期 (1 分钟到 24 小时)。
  • AWS KMS 每个账户的限制 (默认值为 100 TPS)。
  • 访问队列的 IAM 用户或账户数。
  • 存在大量积压事务 (事务积压的越多,就需要执行越多的 AWS KMS 调用)。

例如,让我们假设以下限制:

  • 您将您的数据密钥重用周期设置为 5 分钟 (300 秒)。
  • 您 KMS 账户的默认 AWS KMS TPS 限制为 100 TPS。
  • 您使用一个无积压事务且有 1 个 IAM 用户的 Amazon SQS 队列,对所有队列执行 SendMessage 或 ReceiveMessage 操作。

在这种情况下,您可以按照如下方式计算使用 SSE 的 Amazon SQS 队列的理论最大值:

300 秒 × 100 TPS/1 个 IAM 用户 = 30000 个队列

问:如何估算 AWS KMS 的使用费用?

要预测费用并更好地了解您的 AWS 账单,您可能需要知道 Amazon SQS 使用您 CMK 的频率。

注意:尽管以下公式可以让您很好地了解预测费用,但由于 Amazon SQS 的分布式特征,实际费用可能会更高。

要计算每个队列的 API 请求数 (R),请使用以下公式:

R = B/D * (2 * P + C)

B 是计费周期 (以秒为单位)

D数据密钥重用周期 (以秒为单位)

P 是发送到 Amazon SQS 队列的生产委托者数。

C 是从 Amazon SQS 队列接收的消费委托者数。

重要提示:通常,生产委托者的费用是消费委托者费用的两倍。有关更多信息,请参阅《Amazon SQS 开发人员指南》中的“数据密钥重用周期的工作原理是什么?”

如果生产者和消费者具有不同的 IAM 用户,则费用会增加。

有关示例计算,请参阅《Amazon SQS 开发人员指南》中的“如何估算客户主密钥 (CMK) 的使用费用?”。有关确切的定价信息,请参阅 AWS KMS 服务定价


问:Amazon SQS 是否通过了 PCI DSS 认证?

是的。Amazon SQS 通过了 PCI DSS 第 1 级认证。有关更多消息,请参阅 PCI 合规性

问:Amazon SQS 符合 HIPAA 要求吗?

符合,AWS 已对其 HIPAA 合规性计划进行扩展,其中已将 Amazon SQS 作为一项符合 HIPAA 要求的服务包括进来。如果您已与 AWS 签订商业伙伴协议 (BAA),那么您就可以使用 Amazon SQS 来构建 HIPAA 合规应用程序、存储传输中的消息以及传输消息,其中包括含受保护健康信息 (PHI) 的消息。

如果您已与 AWS 签订商业伙伴协议,那么您就可以立即开始使用 Amazon SQS。如果您未签订商业伙伴协议或者在对您的 HIPAA 合规应用程序使用 AWS 的方面有其他问题,请联系我们,以获取详细信息。

注意:如果您不想通过 Amazon SQS 传输 PHI (或者,如果您的消息超过 256KB),那么您可以使用适用于 Java 的 Amazon SQS 扩展客户端库改为通过 Amazon S3 发送 Amazon SQS 消息负载。除使用 Amazon S3 传输加速外,Amazon S3 在其他方面也是一种符合 HIPAA 要求的服务。有关更多信息,请参阅 Amazon SQS 开发人员指南中的使用适用于 Java 的 Amazon SQS 扩展客户端库


问:消息在 Amazon SQS 消息队列中可以保留多久?

较长消息的保留期可以实现更大的灵活性,让消息产生和消息使用之间的间隔时间更长。

您可以将 Amazon SQS 消息保留期配置为 1 分钟至 14 天之间的值。默认为 4 天。一旦达到消息保留期限,您的消息就会被自动删除。

问:如何配置 Amazon SQS 以支持更长的消息保留期?

要配置消息保留期,请使用管理控制台或 Distributiveness 方法来设置 MessageRetentionPeriod 属性。该属性用于指定消息在 Amazon SQS 中保留的秒数。

您可以使用 MessageRetentionPeriod 属性将消息保留期设置为 60 秒(1 分钟)到 1209600 秒(14 天)之间的值。有关使用此消息属性的更多信息,请参阅 Amazon SQS API 参考

问:如何配置 Amazon SQS 的最大消息大小?

要配置最大消息大小,请使用控制台或 SetQueueAttributes 方法来设置 MaximumMessageSize 属性。该属性用于指定 Amazon SQS 消息可以包含的字节数上限。可以将上限设为 1024 字节 (1KB) 到 262144 字节 (256KB) 之间的值。有关更多信息,请参阅 Amazon SQS 开发人员指南中的使用 Amazon SQS 消息属性

要发送大小超过 256KB 的消息,您可以使用适用于 Java 的 Amazon SQS Extended Client Library。借助该库,您可以在发送的 Amazon SQS 消息中引用 Amazon S3 中的消息负载,该消息负载最大可为 2GB。

问:消息中可以包含哪种类型的数据?

Amazon SQS 消息可以包含不超过 256KB 的文本数据,包括 XML、JSON 和无格式文本。接受以下 Unicode 字符:

#x9 | #xA | #xD | [#x20 to #xD7FF] | [#xE000 to #xFFFD] | [#x10000 to #x10FFFF]

有关更多信息,请参阅 XML 1.0 规范

问:Amazon SQS 消息队列的大小可以是多大?

单个 Amazon SQS 消息队列中的消息没有数量限制。但是,对于标准队列,处于飞行状态的消息数量上限是 120000;对于 FIFO 队列,此上限为 20000。消息的飞行状态是指该消息已由使用组件从队列接收,但尚未从队列中删除。

问:可以创建多少个消息队列?

您可以创建任意数量的消息队列。

问:Amazon SQS 消息队列的名称大小是否有限制?

队列名称限制为 80 个字符。

问:Amazon SQS 消息队列的名称是否有限制?

您可以使用字母数字字符、连字符 (-) 和下划线 (_)。

问:消息队列名称是否可以重新使用?

同一个 AWS 账户和区域内的消息队列名称必须是唯一的。您可以在删除一个消息队列后重新使用该消息队列的名称。


问:如何共享消息队列?

您可以将访问策略语句(并指定要授予的权限)与要共享的消息队列关联。Amazon SQS 可以提供 API,用于创建和管理以下访问策略语句:

  • AddPermission
  • RemovePermission
  • SetQueueAttributes
  • GetQueueAttributes

有关更多信息,请参阅 Amazon SQS API 参考

问:共享队列访问由谁支付费用?

消息队列拥有者负责支付共享消息队列访问的费用。

问:如何标识我希望与之共享消息队列的另一个 AWS 用户?

Amazon SQS API 使用 AWS 账户来标识 AWS 用户。

问:我需要向要共享消息队列的 AWS 用户提供什么?

要与 AWS 用户共享消息队列,您需要提供所要共享的消息队列的完整 URL。进行 CreateQueue 和 ListQueues 操作后,系统会返回 URL。

问:Amazon SQS 是否支持匿名访问?

支持。您可以配置访问策略,允许匿名用户访问消息队列。

问:应该在什么时候使用权限 API?

权限 API 可以向开发人员提供接口,用于共享消息队列的访问权限。但是,此类 API 不支持有条件访问或更高级的使用案例。

问:应该在什么时候将 SetQueueAttributes 操作用于 JSON 对象?

SetQueueAttributes 操作支持全部的访问策略语言。例如,您可以使用策略语言将消息队列的访问权限限制到特定 IP 地址和特定时间。有关更多信息,请参阅 Amazon SQS 开发人员指南中的 Amazon SQS 策略示例


问:Amazon SQS 在哪些区域提供?

有关提供服务的地区,请参阅 AWS 全球基础设施地区表
注意:目前仅在美国西部 (俄勒冈)、美国东部 (俄亥俄)、美国东部 (弗吉尼亚北部) 和欧洲 (爱尔兰) 地区提供 FIFO 队列。此功能将于未来几个月在更多地区推出,敬请期待。

问:是否可以在不同区域中的队列之间共享消息?

不可以。各个区域中的各个 Amazon SQS 消息队列都是独立的。

问:不同区域之间是否有定价差别?

除中国 (北京) 外,所有区域的 Amazon SQS 定价均相同。有关更多信息,请参阅 Amazon SQS 定价

问:如果在不同区域之间传输,定价结构如何?

您可以在同一个区域内的 Amazon SQS 与 Amazon EC2 或 AWS Lambda 之间免费传输数据。

如果在不同区域内的 Amazon SQS 与 Amazon EC2 或 AWS Lambda 之间传输数据,则需要按正常数据传输费率付费。有关更多信息,请参阅 Amazon SQS 定价