目录
Amazon Simple Queue Service (SQS) 简介
Amazon Simple Queue Service (SQS) 是一项完全托管的消息队列服务,它能够帮助我们解耦、扩展微服务、分布式系统和无服务器应用程序。
- 在现代云架构中,不同的应用组件(例如 Web 服务器和图像处理工作线程)需要相互通信。
- 如果一个组件繁忙、响应缓慢或暂时宕机,直接通信可能会导致失败。
- 为了避免这种情况,我们不应直接发送数据,而是将消息发送到 SQS 队列中。
- SQS 队列充当缓冲区,安全地保存这些消息。
- 接收服务一旦可用,就会处理这些消息。
SQS 工作原理:核心生命周期
要理解 SQS,我们需要了解消息在系统中流转的生命周期。
1. 生产者发送消息: “生产者”(例如我们的 Web 服务器)向 SQS 队列发送一条消息。该消息本质上是一个文本有效负载(JSON、XML 或纯文本),大小上限为 256 KB。
2. 消息存储: SQS 跨多个 SQS 服务器冗余存储该消息。它会一直保存在那里,直到消费者准备就绪。
3. 消费者轮询: “消费者”(例如 EC2 实例或 Lambda 函数)从队列中请求消息。
4. 可见性超时(飞行中): 当消费者接收到一条消息时,SQS 不会立即删除它。相反,它会启动一个可见性超时(默认为 30 秒)。在此期间,该消息对其他消费者是“不可见”的。这可以防止多个服务器同时处理同一条消息。
5. 处理与删除:
- 成功: 如果消费者成功处理了消息,它会发起 API 调用从队列中删除该消息。这标志着生命周期的结束。
- 失败: 如果消费者崩溃,或者未能在可见性超时到期前删除消息,该消息将再次变为“可见”。然后,另一个消费者可以接收它并重试。
AWS SQS 架构
在分布式消息传递系统中,涉及三个主要元素:系统组件、队列(分布在 Amazon SQS 服务器上)以及存储在队列中的消息。在此场景中,我们的系统包含多个生产者(向队列发送消息)和消费者(从队列中检索消息)。队列跨多个 Amazon SQS 服务器存储消息(例如 A, B, C, D 和 E),以确保冗余性和高可用性。
!Amazon SQS ArchitectureAWS SQS Architecture
SQS 的核心特性
1. 死信队列 (DLQ)
DLQ 是一个辅助队列,当消息在尝试设定次数(例如 5 次)后仍无法处理成功时,SQS 会自动将其移至此处。这可以防止“毒丸”消息(即导致应用程序崩溃的错误数据)永久阻塞我们的队列。随后,我们可以检查 DLQ 以手动调试问题。
2. 长轮询 与 短轮询
- 短轮询(默认): 即使队列为空,SQS 也会立即返回响应。这可能导致返回空响应并增加成本。
- 长轮询(推荐): SQS 会等待(最多 20 秒)消息到达,然后再发送响应。如果消息到达,它会立即发送。请始终启用长轮询(设置 WaitTimeSeconds > 0),以节省费用并减少无效的 API 调用。
3. 延迟队列
我们可以配置一个队列,将所有新消息的传递延迟特定的时间段(最长 15 分钟)。如果我们的应用程序在处理任务前需要一段“冷静”期,这非常有用。
4. 批处理
为了节省成本并提高性能,我们可以批量发送、接收和删除消息,每次 API 调用最多可处理 10 条消息。就计费而言,这仅被视为一次请求。
AWS SQS 的生命周期
以下是 Amazon SQS 消息生命周期的概述,从其在队列中创建到最终被删除。
!lifecycle-of-an-Amazon-SQSLife Cycle of SQS
逐步创建 SQS 队列 (Amazon Simple Queue Service)
请按照以下步骤使用 AWS 控制台创建 SQS 队列:
步骤 1: 打开 AWS 控制台,在搜索栏中输入“SQS”并选中。如果您需要了解如何创建 AWS 账户,请参考 Amazon Web Services (AWS) – 免费套餐账户设置。
步骤 2: 点击“Create queue”(创建队列)。您应该会看到以下屏幕:
每个字段都有一个 Info(信息)条款。如果您感兴趣,可以点击它并阅读相关内容。
步骤 3: 将队列命名为 ‘geeky_queue‘,然