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

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

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

Amazon 简单队列服务 (Amazon SQS) 是一项完全托管的消息队列服务,可轻松分离和扩展微服务、分布式系统和无服务器应用程序。亚马逊云科技 客户不断发现使用 SQS 构建更具扩展性、弹性和可靠性的应用程序的强大新方法。您可以在各种需要松散耦合和任何吞吐量级别的高性能的用例中利用 SQS,同时通过仅为价值付费并确信不会丢失任何消息来降低成本。使用 Amazon SQS 构建应用程序时,遵循架构最佳实践非常重要。

为了帮助您识别和实施这些最佳实践,亚马逊云科技 提供了 AW S 架构完善的框架 , 用于在 亚马逊云科技 云中设计和运行可靠、安全、高效、经济实惠和可持续的系统。亚马逊云科技 Well-Architected 围绕六大支柱(卓越运营、安全性、可靠性、性能效率、成本优化和可持续性)构建,为客户和合作伙伴提供了一种评估架构和实施可扩展设计的一致方法。

这个由三部分组成的博客系列涵盖了实施 SQS 最佳实践的 亚马逊云科技 架构完善框架的每个支柱。这篇博客文章是该系列的第 1 部分,讨论了使用 亚马逊云科技 架构完善框架 的 卓越 运营支柱 的最佳实践。

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

  • 为 Amazon SQS 实施 亚马逊云科技 架构完善的最佳实践 — 第 2 部分:安全性和可靠性
  • 为 Amazon SQS 实施 亚马逊云科技 架构完善的最佳实践 — 第 3 部分:性能效率、成本优化和可持续性

解决方案概述

Solution architecture for Inventory Updates Process

该解决方案架构显示了库存管理系统的示例。该系统利用 亚马逊简单存储服务(亚马逊 S3) 亚马逊云科技 Lambda 、亚马逊 SQ S 和亚马逊 DynamoDB 来简化库存操作确保准确的库存水平。该系统处理来自多个来源(例如供应商、仓库和零售商店)的频繁更新,这些更新以 CSV 文件形式接收。

然后,这些 CSV 文件被上传到 S3 存储桶,整合和保护库存数据以供库存管理系统访问。系统使用 Lambda 函数读取和解析 CSV 文件,提取单个库存更新记录。后端 Lambda 函数将每条库存更新记录转换为消息并将其发送到 SQS 队列。另一个 Lambda 函数持续轮询 SQS 队列中是否有新消息。收到消息后,它会检索库存更新详细信息并相应地更新 DynamoDB 中的库存水平。

这可确保每种产品的库存数量准确无误并反映最新的变化。通过这种方式,库存管理系统可以实时了解不同地点和供应商的库存水平,使公司能够精确地监控产品的可用性。在 GitHub 存储库 中找到此解决方案的示例代码 。

此示例贯穿本博客系列,重点介绍如何基于 亚马逊云科技 架构完善的框架实施 SQS 最佳实践。

卓越运营支柱

卓越运营支柱包括支持开发和有效运行工作负载、深入了解其运营情况以及持续改进支持流程和程序以创造业务价值的能力。为了实现卓越运营,该支柱推荐了最佳实践,例如定义工作量指标和实现交易可追溯性。这使组织能够获得有关其运营的宝贵见解,发现潜在问题,并相应地优化服务以改善客户体验。此外,了解应用程序的运行状况对于确保其按预期运行至关重要。

最佳实践:使用基础架构即代码部署 SQS

基础架构即代码 (IaC) 可帮助您建模、预置和管理云资源。iaC 的主要优势之一是它简化了基础设施管理。使用 iaC,您可以使用单一的全包式解决方案快速轻松地将您的环境复制到多个 亚马逊云科技 区域。无论您的资源位于何处,这都可以轻松管理您的基础架构。此外,iaC 使您能够以编程、描述性和声明性的方式重复创建、部署和维护基础架构。这减少了手动流程(例如在 亚马逊云科技 管理控制台中创建资源)导致的错误。借助 iaC,您可以轻松控制和跟踪基础架构的变化,从而更轻松地维护和排除系统故障。

要管理 SQS 资源,您可以使用不同的 IaC 工具,例如 亚马逊云科技 无服务器应用程序模型 (亚马逊云科技 SAM) 、亚马逊云科技 CloudFormation 或 亚马逊云科技 云 开发套件 ( 亚马逊云科技 CDK )。 还有用于创建 SQS 资源的第三方解决方案,例如 无服务器框架 。 亚马逊云科技 CDK 是一个受欢迎的选择,因为它允许您使用熟悉的编程语言(例如 Python、Java、TypeScript、Go、JavaScript 和 C#/.NET)预置 亚马逊云科技 资源。

本博客系列介绍如何使用带有 Python 的 亚马逊云科技 CDK 来演示使用 SQS 的最佳实践。例如,以下 亚马逊云科技 CDK 代码创建了一个新的 SQS 队列:

from aws_cdk import (
    Duration,
    Stack,
    aws_sqs as sqs,
)
from constructs import Construct


class SqsCdBlogStack(Stack):
    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # The code that defines your stack goes here

        # example resource
        queue = sqs.Queue(
            self,
            "InventoryUpdatesQueue",
            visibility_timeout=Duration.seconds(300),
        )

最佳实践:配置 CloudWatch 警报,获取大致年龄最旧的消息

必须了解 Amazon CloudWatch 的 SQS 指标和维度,制定计划来评估其行为,并在必要时添加自定义指标。一旦您对这些指标有了很好的了解,就必须确定与您的用例最相关的关键指标,并设置适当的警报来对其进行监控。

SQS 提供的关键指标之一是 Aproxim ateAgeofoldestMessag e 指标。通过监控此指标,您可以确定队列中最早的消息的使用年限,并采取适当的措施来确保消息得到及时处理。要为 Aproxim ateAgeofoldestMessage 指标设置警报,你可以使用 CloudWatch 警报。您可以将这些警报配置为在消息长时间留在队列中时发出警报。您可以使用这些警报来采取行动,例如,扩大使用者的规模,使其更快地处理消息,或者调查消息处理中的潜在问题。

在库存管理示例中,利用 Approx mateAgeofoldestMessage 指标可以提供对 SQS 队列运行状况和性能的宝贵见解。通过监控该指标,您可以检测处理延迟、优化性能并确保在所需时间范围内处理库存更新。这可确保您的库存水平保持准确和最新。以下代码创建警报,如果最早的库存更新请求在队列中超过 30 秒,则会触发该警报。

# Create a CloudWatch alarm for ApproximateAgeOfOldestMessage metric
alarm = cloudwatch.Alarm(
	self,
	"OldInventoryUpdatesAlarm",
	alarm_name="OldInventoryUpdatesAlarm",
	metric=queue.metric_approximate_age_of_oldest_message(),
	threshold=600,  # Specify your desired threshold value in seconds
	evaluation_periods=1,
	comparison_operator=cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
)

最佳实践:在向队列发送消息时添加跟踪标头,以提供分布式跟踪功能,从而更快地进行故障排除

通过实施分布式跟踪,您可以清楚地了解 SQS 队列中的消息流,识别任何瓶颈或潜在问题,并主动对任何表明不健康状态的信号做出反应。跟踪提供了更广阔的应用程序连续视图,并有助于跟踪用户在应用程序中的旅程或交易。

亚马逊云科技 X-Ray 是一个分布式跟踪解决方案的示例 ,该解决方案与 Amazon SQS 集成 , 用于跟踪通过 SQS 队列传递的消息。使用 X-Ray SDK 时,SQS 可以传播跟踪标头以保持跟踪连续性,并支持对下游服务进行跟踪、分析和调试。SQS 支持通过默认 HTTP 标头和 awstrace Header 系统属性跟踪标头。 即使无法通过 X@@ -Ray SDK 进行自动插入,例如,在为新语言构建跟踪 SDK 时,也可以使用 AwstraceHeader 。如果您使用的是 Lambda 下游使用者,则跟踪上下文传播是自动的。

在库存管理示例中,通过使用带有 X-Ray for SQS 的分布式跟踪,您可以深入了解库存管理系统的性能、行为和依赖关系。这种可见性使您能够优化性能,更有效地解决问题,并确保系统的平稳高效运行。以下代码设置了 CSV 处理 Lambda 函数和启用主动跟踪的后端处理 Lambda 函数。Lambda 函数会自动从 SQS 接收 X- Ray TraceID。

# Create pre-processing Lambda function
csv_processing_to_sqs_function = _lambda.Function(
    self,
    "CSVProcessingToSQSFunction",
    runtime=_lambda.Runtime.PYTHON_3_8,
    code=_lambda.Code.from_asset("sqs_blog/lambda"),
    handler="CSVProcessingToSQSFunction.lambda_handler",
    role=role,
    tracing=Tracing.ACTIVE,  # Enable active tracing with X-Ray
)

# Create a post-processing Lambda function with the specified role
sqs_to_dynamodb_function = _lambda.Function(
    self,
    "SQSToDynamoDBFunction",
    runtime=_lambda.Runtime.PYTHON_3_8,
    code=_lambda.Code.from_asset("sqs_blog/lambda"),
    handler="SQSToDynamoDBFunction.lambda_handler",
    role=role,
    tracing=Tracing.ACTIVE,  # Enable active tracing with X-Ray
)

结论

这篇博文探讨了 SQS 的最佳实践,重点是 亚马逊云科技 架构完善的框架的卓越运营支柱。我们探讨了确保使用 SQS 的应用程序平稳运行和最佳性能的关键注意事项。此外,我们还探讨了基础设施即代码在简化基础设施管理方面的优势,并展示了如何使用 亚马逊云科技 CDK 来预置和管理 SQS 资源。

本博客文章系列 的下一部分 介绍了 亚马逊云科技 架构完善的框架 的安全支柱 和 可靠 性支柱 ,并探讨了 SQS 的最佳实践。

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