跳至主要内容

Amazon Simple Queue Service(SQS):完整教程

本教程将指导您如何创建、管理与使用 Amazon SQS 队列,在 AWS 上构建可扩展的分布式应用,并通过控制台与 CLI 的实操示例加以说明。
· 15分钟 阅读

使用 AI 探索

Amazon Simple Queue Service(SQS)是 Amazon Web Services(AWS)提供的全托管消息队列服务。它可用于解耦与扩展分布式系统、微服务和无服务器应用。

本指南将帮助您清晰理解 AWS SQS,涵盖其功能以及队列的设置与管理流程。同时讲解如何发送与接收消息、定价模型、监控与指标、SQS 与 SNS 的比较,并分享最佳实践以实现高效使用。 

如果您没有 AWS 背景,我们的 Introduction to AWS 课程是一个不错的起点。它将带您了解 Amazon Web Services 的世界,并理解其为何处于云计算的前沿。

什么是 AWS SQS?

在深入细节之前,先来了解什么是 AWS SQS,以及它在 AWS 生态系统中的价值。

AWS SQS architecture diagram

Amazon SQS 架构图

AWS SQS 是一种分布式排队系统,使 Web 服务应用能够快速且可靠地将 生产者生成的消息排入队列,供 消费者处理。

队列是等待处理的消息的临时存储库。Amazon SQS 还通过其重投递(redrive)策略提供重试能力,允许多次重试,并使用死信队列(DLQ)来管理易出错的消息:它们可通知开发者问题,并可选择性地存储消息以供日后重新处理。

SQS 的功能与优势

使用 SQS 有诸多好处,包括但不限于以下几点:

AWS SQS key features and benefits

AWS SQS 关键功能与优势

  • 可扩展性:无需预置或管理基础设施,SQS 即可处理任意规模的流量。
  • 持久性:消息会在多个可用区冗余存储。
  • 可用性:为消息的生产与消费提供高可用性。
  • 安全性:提供服务端加密(SSE)以保护消息内容。
  • 灵活性:支持多种消息格式,并可与多种 AWS 服务配合使用。

在解耦与扩展微服务中的用例

多个行业场景都能利用 SQS 的优势,以下展示了部分示例:

AWS SQS use cases in decoupling and scaling microservices

在解耦与扩展微服务中的 AWS SQS 用例

  • 工作队列:在多个工作进程之间分发任务。
  • 数据库写入缓冲:保护数据库免受过量写入负载的影响。
  • 请求卸载:将耗时操作移出交互式请求路径。
  • 批处理:一次性收集并处理一组消息。

设置 AWS SQS

了解了 SQS 是什么之后,接下来看看如何进行设置。本节将引导您了解前提条件以及如何访问 SQS 控制台。

前提条件

开始使用 AWS SQS 前,请确保您具备以下条件:

  • 一个有效的 AWS 账户。可通过官方页面创建。
  • 为访问 SQS 配置必要的 IAM 角色与权限。

设置 IAM 权限的方法:

  • 前往 IAM 控制台。
  • 创建新策略。

Setting Up AWS SQS

设置 AWS SQS

  • 创建策略有两种主要方式:可视化方式或 JSON。在这里,我们采用更直观的可视化方式。 
  • 在“Service”区域选择“SQS”,将Effect 设置为“Allow”,并允许以下权限:sqs:CreateQueue、sqs:DeleteQueue、sqs:SendMessage、sqs:ReceiveMessage、sqs:DeleteMessage。

Setting Up AWS SQS

设置 AWS SQS

  • 允许这些操作访问“All”资源,然后选择“Next”。
  • 为策略命名,我们这里为“SQSHandsOnPolicies”,最后创建策略。

Setting Up AWS SQS

设置 AWS SQS

最终的策略在 JSON 格式下应类似如下:

Setting Up AWS SQS

设置 AWS SQS

下面简要概览一下我们的策略定义:

  • “Version”: “2012-10-17” 是当前的 IAM 策略语言版本。
  • 该策略包含一个 “Statement”,用于定义一组权限。
  • “Sid”: “VisualEditor0” 表示该策略通过可视化编辑器创建。
  • “Effect”: “Allow” 表示允许这些操作。
  • “Action”:该列表指定了上面允许的 SQS 操作:
  • “Resource”: “*” 表示这些操作可在账户内所有 SQS 资源上执行。

该策略允许对账户内任意 SQS 队列执行创建、删除、发送和接收消息的完整访问。该策略较为宽松,生产环境中建议将其限制到特定队列 ARN,以提高安全性。

如需进一步了解 IAM 配置,我们的教程 The Complete Guide to AWS Identity and Access Management (IAM) 将教您如何保护 AWS 环境、用用户、组和角色管理访问,并落实稳健的安全最佳实践。

若想深化对 AWS 配置的理解,建议阅读 How to Setup and Configure AWS: A Comprehensive Tutorial,了解关键设置、安全最佳实践,以及如何利用 AWS 服务进行数据分析与机器学习。

访问 Amazon SQS 控制台

完成前提条件后,下一步是访问 SQS 控制台,开始创建和管理队列。步骤如下:

  • 在顶部搜索栏输入“SQS”,从下拉列表中选择“Simple Queue Service”。
  • 您将被引导至 SQS 仪表板。

Accessing the Amazon SQS Console

访问 Amazon SQS 控制台

创建与管理 SQS 队列

进入 SQS 控制台后,我们可以开始创建与管理队列。本节将演示创建标准队列与 FIFO 队列。

不过,IAM 策略在这里起到什么作用呢?

我们在前提条件部分创建的 IAM 策略对于队列的创建与管理至关重要。其作用体现在以下方面:

  • 用户或角色关联:该策略必须附加到您用于访问 SQS 控制台或 AWS CLI 的 IAM 用户或角色。
  • 权限检查:当您尝试创建队列(或执行任何 SQS 操作)时,AWS 会检查该策略以确保您具备相应权限。
  • 操作授权:策略中的 sqs:CreateQueue 权限明确允许创建队列。若无此权限,创建队列时会收到“Access Denied”错误。
  • 持续操作:策略中的其他权限(sqs:SendMessage、sqs:ReceiveMessage、sqs:DeleteMessage、sqs:DeleteQueue)允许您在创建后对队列执行各类操作。

在弄清上述内容后,我们继续创建队列,从标准队列开始。

创建标准队列

标准队列是 SQS 的默认队列类型。创建步骤如下:

  • 在 SQS 仪表板上,点击“Create queue”。
  • 选择“Standard”作为队列类型。
  • 输入队列名称,在此场景中为“SQSHandsOn”。
  • 配置队列设置:可见性超时、消息保留期、最大消息大小与投递延迟。这里保持默认值,然后点击“Create queue”。

Creating a Standard Queue

创建标准队列

成功创建队列后会显示确认消息,如下所示,并附带该队列的更多信息。

Creating a Standard Queue

创建标准队列

创建 FIFO 队列

FIFO 队列用于保证消息处理的顺序。创建步骤如下: 

  • 在 SQS 仪表板上,点击“Create queue”。
  • 选择“FIFO”作为队列类型。
  • 输入队列名称(必须以“.fifo”结尾)。本文将其命名为“SQSHandsOn.fifo”。
  • 与上述类似,其余设置保持默认,然后点击“Create queue”。 

Creating a FIFO Queue

创建 FIFO 队列

与标准队列类似,成功创建 FIFO 队列后也会提供用于发送消息的相关详情。

Creating a FIFO Queue

创建 FIFO 队列

标准队列与 FIFO 队列的差异

在 Amazon SQS 中选择标准队列还是 FIFO 队列时,理解它们各自的特性与能力至关重要。 

下表给出了对比分析,帮助您判断哪种队列更适合您的应用需求:

Differences between Standard and FIFO Queues

标准队列与 FIFO 队列的差异

在 SQS 中发送与接收消息

现在队列已全部就绪,开始发送与接收消息。本节将介绍如何通过 AWS 管理控制台和 AWS 命令行界面(CLI)完成这些操作。

发送消息

我们将使用标准队列和 FIFO 队列演示发送消息的流程。

标准队列

使用 AWS 管理控制台
  • 在 SQS 仪表板中选择您的队列。
  • 点击“Send and receive messages”。
  • 在“Message body”字段中输入消息,例如:“该队列是通过《Amazon Simple Queue Service(SQS)完整教程》创建的。”
  • 点击“Send message”。

Sending Messages Using AWS Management Console

使用 AWS 管理控制台发送消息

消息发送后会弹出确认提示。点击“View details”可查看消息详情,如下所示。

Sending Messages Using AWS Management Console

使用 AWS 管理控制台发送消息

最后在“Receive messages”部分,我们可以看到当前有 1 条可用消息。

Sending Messages Using AWS Management Console

使用 AWS 管理控制台发送消息

使用 AWS CLI SQS

通过 CLI 发送消息的主要步骤如下模板所示。

aws sqs send-message --queue-url [YOUR URL]--message-body "YOUR MESSAGE"

对于标准队列,URL 可参考上方对应截图。在 CLI 中,我们发送一条不同的消息:

  • URL: https://sqs.us-east-1.amazonaws.com/022499002265/SQSHandsOn
  • 消息:“Message sent via AWS CLI”

开始使用 CLI 的第一步是进行配置,以便其可与我们的 AWS 资源交互,这需要以下凭证:

  • Access key ID
  • Secret access key
aws configure

配置完成后,使用正确的参数值运行以下命令:

aws sqs send-message --queue-url https://sqs.us-east-1.amazonaws.com/022499002265/SQSHandsOn --message-body "Message sent via AWS CLI"

Sending Messages Using CLI

使用 CLI 发送消息

命令执行返回的 JSON 输出对应新发送消息的详细信息。现在我们可以看到 SQSHandsOn 队列中已有两条消息。

Sending Messages Using CLI

使用 CLI 发送消息

FIFO 队列

向 FIFO 队列发送消息与标准队列略有不同。

为更好地说明该场景,假设您运营一家销售电子设备的电商平台。 

系统需要处理多种操作,例如订单处理、库存更新与支付管理。在此情况下,我们可以使用 SQS FIFO 队列来确保这些操作按正确顺序处理,并且不产生重复。

  • CLI 示例 1(客户订单):当客户下达新订单时发送该消息。订单处理系统将按照接收顺序依次处理。
  • CLI 示例 2(库存更新):订单处理完成后发送该消息以更新库存,确保随着产品售出,库存水平得到准确维护。
  • 控制台示例(支付处理):当订单需要处理支付时生成该消息,确保按接收顺序处理支付并避免重复扣款。

对这些操作使用 FIFO 队列可确保:

  • 订单按下单顺序处理。
  • 库存更新按正确顺序执行,防止超卖。
  • 支付只处理一次,且顺序正确。

向 SQS FIFO 队列发送消息时,请牢记两个关键要素:

  • 消息组 ID(Message group ID):所有消息都必须提供。用于确定同一组内消息的顺序处理。
  • 消息去重 ID(Message deduplication ID):确保每条消息在 5 分钟窗口内仅被处理一次。

理解以上要点后,继续使用 CLI 的方式。

使用 AWS CLI SQS

   我们可以运行以下命令,将前两条消息发送至 FIFO 队列。

  • CLI 示例 1:发送客户订单:
aws sqs send-message --queue-url https://sqs.us-east-1.amazonaws.com/022499002265/SQSHandsOn.fifo --message-body "Process customer order: #A1001" --message-group-id "CustomerOrders" --message-deduplication-id "Order-A1001-20240817-1"

首次执行的输出如下所示。

Example 1 - Sending Messages Result Using CLI with FIFO

示例 1 - 使用 CLI 向 FIFO 发送消息的结果

  • CLI 示例 2:发送库存更新:
aws sqs send-message --queue-url https://sqs.us-east-1.amazonaws.com/022499002265/SQSHandsOn.fifo --message-body "Update inventory: ProductX -5 units"  --message-group-id "InventoryUpdates" --message-deduplication-id "Inventory-ProductX-20240817-1"

输出如下所示。

Example 2 - Sending Messages Result Using CLI with FIFO

示例 2 - 使用 CLI 向 FIFO 发送消息的结果

截至目前,已有两条消息发送至 FIFO 队列,如下所示。

Sending Messages Result Using CLI with FIFO - Number of messages

使用 CLI 向 FIFO 队列发送消息的结果 - 消息数量

使用 AWS 管理控制台

与标准队列类似,也可通过管理控制台发送消息:

  • 在“Queues”页面选择“SQSHandsOn.fifo”。
  • 选择“Send and receive message”选项卡以发送消息。
  • 需要填写其他字段,例如“Message group ID”和“Message deduplication ID”。

Sending Messages Result Using Management Console with FIFO

通过管理控制台向 FIFO 队列发送消息的结果

现在可以看到 FIFO 队列中的消息总数为 3。

Sending Messages Result Using Management Console with FIFO - Total number of messages

通过管理控制台向 FIFO 队列发送消息的结果 - 消息总数

接收与删除消息

接收与删除消息与发送同样重要。以下是相应步骤。

标准队列

使用 AWS 管理控制台
  • 在 SQS 仪表板中选择您的队列。
  • 点击“Send and receive messages”。
  • 点击“Poll for messages”。
  • 消息将显示在“Messages”区域。

Receiving Messages Using Management Console with Standard Queue

通过 AWS 管理控制台在标准队列中接收消息

上图展示了标准队列中的两条消息。

使用 AWS CLI SQS

下面是从标准队列接收消息的通用命令。

aws sqs receive-message --queue-url [YOUR URL]

结合我们的标准队列,完整命令为:

aws sqs receive-message --queue-url https://sqs.us-east-1.amazonaws.com/022499002265/SQSHandsOn

FIFO 队列

通过管理控制台检索消息的流程与标准队列相同。

使用 AWS CLI 从 FIFO 队列接收消息,可使用 aws sqs receive-message 命令。基本结构如下:

aws sqs receive-message --queue-url https://sqs.us-east-1.amazonaws.com/022499002265/SQSHandsOn.fifo --attribute-names All --message-attribute-names All --max-number-of-messages 3
  • -attribute-names All:检索所有消息属性。
  • -message-attribute-names All:检索所有自定义消息属性。
  • --max-number-of-messages 3:指定最大接收消息数为

执行上述命令后,将返回 FIFO 队列中的三条消息。

Receiving Messages Result Using CLI with FIFO

使用 CLI 从 FIFO 队列接收消息的结果

AWS SQS 定价

理解定价模型对于以具成本效益的方式使用 SQS 至关重要。本节将拆解定价并提供成本管理建议。

总体而言,AWS SQS 的定价基于 API 请求次数、数据传输量以及所用的可选功能。

请求定价

下表概览了 SQS 请求的定价:

 

标准队列 

(每百万次请求)

FIFO 队列 

(每百万次请求)

每月前 100 万次请求

免费

免费

每月 100 万至 1000 亿次请求

$0.40

$0.5

每月 1000 亿至 2000 亿次请求

$0.30

$0.40

每月超过 2000 亿次请求

0.24

$0.35

定价来源:AWS SQS 页面

数据传输定价

数据传输定价请参考下表:

入站数据传输

价格

所有入站数据传输

$0.00/GB

出站数据传输

价格

每月前 10 TB

$0.09/GB

接下来的 40 TB/月

$0.085/GB

接下来的 100 TB/月

$0.07/GB

超过 150 TB/月

$0.05/GB

定价来源:AWS SQS 页面

成本管理建议

以下是一些快速管理 SQS 成本的建议:

  • 使用长轮询,减少空轮询次数。
  • 对发送与接收操作进行批处理。
  • 使用 AWS Cost Explorer 监控用量。

AWS SQS 监控与指标

有效的监控对于保持 SQS 健康运行至关重要。本节将介绍关键指标及告警的设置方法。

关键 AWS SQS 指标

以下是需要重点关注的一些指标:

Key AWS SQS Metrics

关键 AWS SQS 指标

ApproximateNumberOfMessagesVisible

该指标表示队列中可供检索的消息数,是队列积压与处理效率的指示器。数值过高可能意味着出现处理瓶颈。

ApproximateAgeOfOldestMessage

该指标显示最早(未删除)消息在队列中的停留时间。它有助于识别消息处理潜在问题,如消息阻塞或消费者缓慢。对于 FIFO 队列,这一指标尤为重要,因为它可能反映消息组被阻塞。

NumberOfMessagesSent

该指标跟踪加入队列的消息数量。用于监控队列的输入速率并识别消息产生的异常峰值。注意,手动发送到死信队列的消息也计入此数。

NumberOfMessagesReceived

该指标表示从队列返回给消费者的消息数。可用于跟踪队列输出速率,并与NumberOfMessagesSent 对比以评估处理效率。与NumberOfMessagesSent类似,不包含因处理失败而自动转移至死信队列的消息。

设置 CloudWatch 告警

以下以这四个指标之一为例演示 CloudWatch 告警的创建流程。所有指标的流程相同。为简化起见,我们仅关注一个指标,并只针对标准 SQS(SQSHandsOn)。 

为 ApproximateNumberOfMessagesVisible 设置告警的主要步骤如下。

CloudWatch 告警可在潜在问题出现时提醒您。通过管理控制台设置方法如下:

  • 搜索“CloudWatch”并进入。
  • 在左侧导航中点击“Alarms”。
  • 点击“Create alarm”。
  • 点击“Select metric”。
  • 在“All metrics”选项卡找到并点击“SQS”。
  • 点击“Queue Metrics”。 
  • 找到您的队列并选择指标 ApproximateNumberOfMessagesVisible 以及标准队列 SQSHandsOn。

Setting Up CloudWatch Alarms

设置 CloudWatch 告警

  • 在上述页面选择“Graph metrics”。
  • 选择统计方式为“Average”。
  • 设置周期为 5 分钟,然后点击“Select metric”。

Setting Up CloudWatch Alarms

设置 CloudWatch 告警

  • 为指标命名(例如“SQS-AvgHighMessageCount-SQSHandsOn”),并将“Threshold Type”设置为“Static”。
  • 设置告警条件。本例为“Greater”。
  • 将阈值设为“20”,点击“Next”。

Setting Up CloudWatch Alarms

设置 CloudWatch 告警

上述配置表示:当SQSHandsOn 队列的可见消息平均数在 5 分钟内任一数据点超过 20 时,告警将被触发。图表会显示当前消息数(蓝线)与阈值(红线,20)的关系。

此设置有助于监控队列是否累积过多未处理消息,这可能表明处理延迟或消费者出现问题。 

消费者是指所有从队列中检索并处理消息的应用或系统组件。

如果平均消息数超过 20,您将收到告警,便于排查并采取适当措施,防止队列积压。

  • 点击“Next”会进入“Configure actions”,此处暂不需要设置,保持默认即可。
  • 选择“Next”,并为告警提供唯一名称,本例为 "SQSHandsOn-HighMessageCount"。
  • 可选地添加描述,然后点击“Next”。
  • 检查设置并点击“Create alarm”。

Setting Up CloudWatch Alarms

设置 CloudWatch 告警

  • 应能看到绿色确认消息,以及在“Name”列显示的告警名称。

Setting Up CloudWatch Alarms

设置 CloudWatch 告警

  • 点击告警名称后,将显示如下的完整详情:

Setting Up CloudWatch Alarms

设置 CloudWatch 告警

我们针对 SQSHandsOn 队列设置的告警当前处于“Insufficient data”状态。这意味着 CloudWatch 暂无足够信息来判断是否应触发告警。 

图表暂无数据点,说明队列较新。该告警会在 5 分钟内平均消息数超过 20 时被触发。 

随着队列变为活跃并有消息处理,CloudWatch 将收集数据并更新告警状态。 

AWS SNS 与 SQS 的比较

虽然 SQS 与 SNS 均为消息服务,但用途不同。本节将阐明二者的差异与各自适用场景。

SNS versus SQS comparison table

SNS 与 SQS 对比表

AWS SQS 最佳实践

遵循最佳实践有助于充分发挥 SQS 的价值。以下是一些优化建议:

  • 使用长轮询以降低成本与延迟。
  • 为问题消息实现死信队列。
  • 尽可能使用批量操作。
  • 通过合适的访问策略保护您的队列。
  • 监控队列深度并相应调整处理能力。
  • 对敏感数据启用传输中与静态加密。

总结

AWS SQS 是构建可扩展且高弹性的云应用的强大工具。通过解耦应用组件,您可以获得更高的灵活性、容错性与可扩展性。凭借易用性、强大的功能集以及与其他 AWS 服务的集成,SQS 是现代云架构的基础服务之一。

请务必监控使用情况、优化实现并遵循最佳实践,以充分发挥 AWS SQS 的作用。随着应用的增长与演进,SQS 能适应不断变化的需求,成为您 AWS 工具箱中的重要资产。

继续您的 AWS 学习之旅,报名我们的 AWS Cloud Technology and Services 课程。迈出第一步,助力职业发展,并进一步获取 AWS 认证。

常见问题

SQS 中标准队列和 FIFO 队列有什么区别?

标准队列提供无限吞吐量与至少一次投递,但不保证消息顺序。相比之下,FIFO 队列确保消息按发送顺序精确处理,并保证每条消息只处理一次。

如何控制对我的 SQS 队列的访问?

您可以使用IAM 策略与SQS 资源策略控制对 SQS 队列的访问。IAM 策略用于管理用户与角色的权限;SQS 策略在队列层面管理访问,可将权限限制到特定 AWS 账户或操作。

使用 AWS SQS 的成本有哪些?

AWS SQS 的成本基于 API 请求次数与数据传输。每月前 100 万次请求免费;之后的定价会随请求次数与所用附加功能(如FIFO 队列和长轮询)而变化。

如何提升我的 SQS 队列性能?

为优化性能,请使用长轮询减少空轮询,实施批处理操作以批量发送与接收消息,并使用CloudWatch监控队列以便按需调整消息处理能力。

Zoumana Keita

作者

Zoumana Keita

一位多才多艺、乐于分享知识并回馈他人的数据科学家。Zoumana 是 YouTube 内容创作者,也是 Medium 上的顶尖科技写作者。他热爱演讲、编程与教学。Zoumana 拥有两个硕士学位:其一是在法国巴黎获得的计算机科学硕士,专注于机器学习;其二是在美国德州理工大学获得的数据科学硕士。他的职业生涯始于法国 Groupe OPEN 的软件开发工程师,随后加入 IBM 担任机器学习顾问,为保险公司构建端到端的 AI 解决方案。之后,Zoumana 加入了 Axionable——一家总部位于巴黎与蒙特利尔的首家“可持续 AI”初创公司。在那里,他担任数据科学家,为来自法国、蒙特利尔、新加坡和瑞士的客户交付 AI 产品,主要聚焦 NLP 场景。此外,他将 5% 的时间投入到研发工作。目前,他在 IFC(世界银行集团)担任高级数据科学家。

主题