为亚马逊 SQS 实施 亚马逊云科技 架构完善的最佳实践 — 第 3 部分

作者: 帕斯卡尔·沃格尔 | 2023

本博客由高级解决方案架构师Chetan Makvana和高级解决方案架构师Hardik Vasa撰写。

这是由三部分组成的博客文章系列的第三部分,该系列 使用亚马逊云科技架构 完善的框架演示了 亚马逊简单队列服务 (Amazon SQ S ) 的最佳实践。

这篇博文介绍了使用 绩效支柱 成本优化支柱和 可持续发展 支柱 的最佳实践 。该 系列第一部分中 介绍的 库存管理示例 将继续作为示例。

另请参见该系列的其他两个部分:

  • 为亚马逊 SQS 实施 亚马逊云科技 架构完善的最佳实践 — 第 1 部分:卓越运营
  • 为 Amazon SQS 实施 亚马逊云科技 架构完善的最佳实践 — 第 2 部分:安全性和可靠性

绩效效率支柱

性能效率支柱 包括高效使用计算资源以满足系统要求的能力,以及在需求变化和技术发展时保持这种效率的能力。它推荐了使用权衡来提高性能的最佳实践,例如学习设计模式和服务,并确定权衡如何影响客户和效率。

通过采用这些最佳实践,您可以通过采用适当的配置和技术来优化 SQS 的性能,同时考虑特定用例的利弊。

最佳实践:使用操作批处理或水平扩展或两者兼而有之来提高吞吐量

为了在 SQS 中实现高吞吐量,优化消息处理性能至关重要。您可以使用两种技术: 水平缩放 动作批处理

在处理高消息量时,可以考虑通过增加每个客户端的线程数、添加更多客户端或两者兼而有之来横向扩展消息生成器和使用者。通过将负载分配到多个线程或客户端,您可以同时处理大量消息。

操作批处理将批处理操作的延迟分布到批处理请求中的多条消息上,而不是接受单条消息的整个延迟。由于每次往返都需要更多工作,因此批处理请求可以更有效地使用线程和连接,从而提高吞吐量。您可以将批处理与水平扩展相结合,以提供比单个消息请求更少的线程、连接和请求数的吞吐量。

第 1 部分中 介绍的库存管理示例中 ,这种扩展行为由 亚马逊云科技 管理,用于负责后端处理的 亚马逊云科技 L ambda 函数。当 Lambda 函数订阅 SQS 队列时,Lambda 会在等待清单更新请求到达时轮询该队列。Lambda 批量使用消息,从五个并发批处理开始,一次使用五个函数。如果队列中有更多消息,Lambda 每分钟最多会添加 60 个函数,最多可添加 1,000 个函数来使用这些消息。

这意味着,Lambda 最多可以扩展到 1,000 个并发 Lambda 函数来处理来自 SQS 队列的消息。批处理使库存管理系统能够有效地处理大量库存更新消息。这确保了库存水平的实时可见性,并提高了库存管理操作的准确性和响应能力。

最佳实践:在 SQS 标准队列和先入先出 (FIFO) 队列之间进行权衡

SQS 支持两种类型的队列:标准队列和 FIFO 队列。了解 SQS 标准队列和 FIFO 队列之间的利弊权衡使您能够做出符合应用程序要求和优先级的明智选择。虽然 SQS 标准队列支持几乎无限的吞吐量,但它牺牲了严格的消息顺序,偶尔会以与消息发送顺序不同的顺序传送消息。如果保持事件的确切顺序对您的应用程序并不重要,那么使用 SQS 标准队列可以在吞吐量和可扩展性方面带来显著的好处。

另一方面,SQS FIFO 队列保证了消息的顺序和一次性处理。这使它们适用于维护事件顺序至关重要的应用程序,例如金融交易或事件驱动的工作流程。但是,与标准队列相比,FIFO 队列的吞吐量较低。通过批处理,它们每个 API 方法每秒最多可以处理 3,000 笔交易 (TPS),不使用批处理可以处理 300 TPS。考虑仅在事件顺序对应用程序很重要时才使用 FIFO 队列,否则使用标准队列。

在库存管理示例中,由于库存记录的顺序并不重要,因此 SQS 标准队列中可能发生的潜在无序消息传送不太可能影响库存处理。这使您可以利用 SQS 标准队列提供的好处,包括它们每秒处理大量事务的能力。

成本优化支柱

成本优化支柱 包括运行系统以最低价格提供商业价值的能力。它推荐了构建和运营具有成本意识的工作负载的最佳实践,这些工作负载可以实现业务成果,同时最大限度地降低成本并使您的组织能够最大限度地提高投资回报率。

最佳实践:为 SQS 配置成本分配标签以组织和识别 SQS 以进行成本分配

明确定义的标签策略在建立准确的退款或摊牌模型中起着至关重要的作用。通过为资源(例如 SQS 队列)分配适当的标签,您可以精确地将成本分配给不同的团队或应用程序。这种精细度可确保公平透明的成本分配,从而实现更好的财务管理和问责制。

在库存管理示例中,标记 SQS 队列允许在库存部门下进行特定的成本跟踪,从而可以更准确地评估费用。以下代码片段显示如何使用 亚马逊云科技 Could 开发套件 (亚马逊云科技 CDK) 标记 SQS 队列。

# Create the SQS queue with DLQ setting
queue = sqs.Queue(
    self,
    "InventoryUpdatesQueue",
    visibility_timeout=Duration.seconds(300),
)

Tags.of(queue).add("department", "inventory")

最佳实践:使用长轮询

SQS 提供两种从队列接收消息的方法:短轮询和长轮询。默认情况下,队列使用短轮询,其中 R eceiveMessage 请求查询服务器子集以识别可用消息。即使查询未找到任何消息,SQS 也会立即发送响应。

相比之下,长轮询会查询 SQS 基础架构中的所有服务器以检查可用消息。SQS 仅在收集了至少一条消息后做出响应,并遵守指定的最大值。如果没有立即可用的消息,则请求将保持打开状态,直到有消息可用或轮询等待时间到期。在这种情况下,将发送空响应。

短轮询可提供即时响应,使其适用于需要快速反馈或近乎实时处理的应用程序。另一方面,当效率优先于即时反馈时,长轮询是理想的选择。它减少了 API 调用,最大限度地减少了网络流量,提高了资源利用率,从而节省了成本。

在库存管理示例中,长轮询可以提高处理库存更新的效率。它以 10 个批次的形式收集和检索可用的库存更新消息,从而降低了 API 请求的频率。这种批处理方法优化了资源利用率,最大限度地减少了网络流量,减少了过多的 API 消耗,从而节省了成本。您可以使用 批量大小和批处理窗口 配置此行为 :

# Add the SQS queue as a trigger to the Lambda function
sqs_to_dynamodb_function.add_event_source_mapping(
    "MyQueueTrigger", event_source_arn=queue.queue_arn, batch_size=10
)

最佳实践:使用批处理

将消息批处理在一起允许您在单个 API 调用中发送或检索多条消息。与单独发送或检索消息相比,这减少了处理或检索消息所需的 API 请求数量。由于 SQS 定价基于 API 请求的数量,因此减少请求数量可以节省成本。

要发送、接收和删除消息,以及通过单个操作更改多条消息的可见性超时,请使用 Amazon SQS 批处理 API 操作 。这还有助于减少传输的数据,有效降低相关的数据传输成本,尤其是在消息较多的情况下。

在库存管理示例的上下文中,CSV 处理 Lambda 函数在每个 API 调用中将 10 条库存记录组合在一起,形成一个批处理。这样,与单独发送每条记录相比,API 请求的数量减少了 10 倍。这种方法优化了 API 资源的利用率,简化了消息处理,最终有助于提高成本效率。以下是 CSV 处理 Lambda 函数的代码片段,展示了如何使用 SendMessageBatch 通过单个操作发送 10 条消息

# Parse the CSV records and send them to SQS as batch messages
csv_reader = csv.DictReader(csv_content.splitlines())
message_batch = []
for row in csv_reader:
    # Convert the row to JSON
    json_message = json.dumps(row)

    # Add the message to the batch
    message_batch.append(
        {"Id": str(len(message_batch) + 1), "MessageBody": json_message}
    )

    # Send the batch of messages when it reaches the maximum batch size (10 messages)
    if len(message_batch) == 10:
        sqs_client.send_message_batch(QueueUrl=queue_url, Entries=message_batch)
        message_batch = []
        print("Sent messages in batch")

最佳实践:使用临时队列

如果使用同步双向通信进行短暂的轻量级消息传送,则可以使用 临时队列 临时队列使您可以轻松创建和删除许多临时消息收发目的地,而不会增加您的 亚马逊云科技 账单。这背后的关键概念是 虚拟队列 。虚拟队列允许您将许多低流量队列多路复用到一个 SQS 队列中。创建虚拟队列仅对本地缓冲区进行实例化,以便在消费者到达时为其保存消息;没有对 SQS 的 API 调用,也没有与创建虚拟队列相关的费用。

库存管理示例不使用临时队列。但是,在涉及短暂的轻量级消息传递和同步双向通信的用例中,采用使用临时队列和虚拟队列的最佳做法可以提高整体效率、降低成本并简化消息传送目标的管理。

可持续发展支柱

可持续发展支柱 提供最佳实践,以实现 亚马逊云科技 工作负载的可持续发展目标。它包括与能效和资源优化相关的注意事项。

最佳实践:使用长轮询

除了成本优化支柱中解释的成本优化优势外,长轮询还通过减少 API 请求、最大限度地减少网络流量和优化资源利用率来提高资源效率方面发挥着至关重要的作用。

通过批量收集和检索可用消息,长轮询降低了 API 请求的频率,从而提高了资源利用率并最大限度地减少了网络流量。通过长时间轮询减少过多的 API 消耗,您可以有效地使用资源。它批量收集和检索消息,从而减少过度的 API 消耗和不必要的网络流量。

通过减少 API 调用,它优化了数据传输和基础设施运营。此外,长轮询的批处理方法可以优化资源分配,更有效地利用系统资源并提高能源效率。这使库存管理系统能够有效地处理大量消息,同时以具有成本效益和资源节约的方式运行。

结论

这篇博文使用 亚马逊云科技 架构完善的框架中的 性能效率支柱 成本优化支柱 可持续发展支柱 探讨了 SQS 的最佳实践。我们将介绍诸如批处理、消息批处理和扩展注意事项之类的技术。我们还将讨论重要的注意事项,例如资源利用、最大限度地减少资源浪费和降低成本。

这篇由三部分组成的博客文章系列涵盖了广泛的最佳实践,涵盖了 亚马逊云科技 架构完善的框架的卓越运营、安全性、可靠性、性能效率、成本优化和可持续性支柱。通过遵循这些准则并利用 亚马逊云科技 架构完善的框架的力量,您可以使用 SQS 构建强大、安全和高效的消息传送系统。

如需更多无服务器学习资源,请访问 无服务器世界