Auto Scaling
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

基于 Amazon SQS 进行扩展

Amazon Simple Queue Service (Amazon SQS) 是可扩展的消息排队系统,当消息在应用程序架构的各个组件之间传输时,该系统可以存储消息。Amazon SQS 可以让 Web 服务应用程序快速可靠地对一个组件生成、由另一个组件使用的消息进行排队。队列是等待处理的消息的临时储存库。有关更多信息,请参阅 Amazon Simple Queue Service 开发人员指南

例如,假设您有一个用于接收客户订单的 Web 应用程序。该应用程序在已配置为处理典型数量的订单的 Auto Scaling 组中的 EC2 实例上运行。该应用程序将订单放置在 Amazon SQS 队列中,选取订单以备处理,处理订单,然后将已处理的订单返回给客户。下图将演示此示例的架构。

 使用队列架构图的 Auto Scaling

如果您的订单水平始终保持不变,该架构将运作良好。如果订单水平发生变化,会发生什么?当订单增加时,需要启动更多 EC2 实例,当订单减少时,需要终止多余的 EC2 实例。如果订单按照可预见的计划增长和降低,您可以指定执行扩展活动的时间和日期。有关更多信息,请参阅 计划的扩展。另外,您可以根据条件进行扩展,例如 SQS 队列中的消息数。有关更多信息,请参阅 动态扩展

队列可以提供用于方便地确定应用程序上的负载的机制。您可以使用队列长度(可从队列中检索的消息数量)来确定负载。因为队列中的每个消息都代表来自用户的请求,所以测量的队列长度十分近似于应用程序上的负载。CloudWatch 集成了 Amazon SQS,可以收集、查看和分析来自 SQS 队列的指标。您可以使用 Amazon SQS 发送的指标来确定任何时间点的 SQS 队列长度。有关 Amazon SQS 发送到 CloudWatch 的所有指标的列表,请参阅 Amazon Simple Queue Service 开发人员指南 中的 Amazon SQS 指标

以下示例创建的 Auto Scaling 策略将 Auto Scaling 组配置为根据 SQS 队列中的消息数进行扩展。

使用 AWS CLI 通过 Amazon SQS 进行扩展

以下示例介绍如何创建扩大和缩小策略,以及如何为扩展策略创建、验证和确认 CloudWatch 警报。假设您已经有一个 SQS 队列、一个 Auto Scaling 组,以及运行使用 SQS 队列的应用程序的 EC2 实例。

创建扩展策略

您可以创建扩展策略,告诉 Auto Scaling 组在指定条件改变时要执行什么操作。

创建扩展策略的步骤

  1. 使用以下 put-scaling-policy 命令创建一个为 Auto Scaling 组增加一个 EC2 实例的扩展策略:

    Copy
    aws autoscaling put-scaling-policy --policy-name my-sqs-scaleout-policy -–auto-scaling-group-name my-asg --scaling-adjustment 1 --adjustment-type ChangeInCapacity

    Auto Scaling 返回新策略的 Amazon 资源名称 (ARN)。将 ARN 保存在安全位置。在创建 CloudWatch 警报时,会需要它。

  2. 使用以下 put-scaling-policy 命令创建一个将 Auto Scaling 组减少一个 EC2 实例的收缩策略:

    Copy
    aws autoscaling put-scaling-policy --policy-name my-sqs-scalein-policy --auto-scaling-group-name my-asg --scaling-adjustment -1 --adjustment-type ChangeInCapacity

    Auto Scaling 返回新策略的 ARN。将 ARN 保存在安全位置。在创建 CloudWatch 警报时,会需要它。

创建 CloudWatch 警报

下一步,通过识别要监控的指标、定义扩展条件,然后将警报与您在先前任务中创建的扩展策略相关联,来创建警报。

注意

所有活动的 SQS 队列每 5 分钟向 CloudWatch 发送一次指标。我们建议您将警报 Period 设置为至少 300 秒。将警报 Period 设置为低于 300 秒将导致在等待指标时警报进入 INSUFFICIENT_DATA 状态。

创建 CloudWatch 警报

  1. 使用以下 put-metric-alarm 命令来创建警报,如果队列中可处理的消息的数量 (ApproximateNumberOfMessagesVisible) 增加到 3,并持续 5 分钟保持大于等于 3,则该警报增加 Auto Scaling 组的大小。

    Copy
    aws cloudwatch put-metric-alarm --alarm-name AddCapacityToProcessQueue --metric-name ApproximateNumberOfMessagesVisible --namespace "AWS/SQS" --statistic Average --period 300 --threshold 3 --comparison-operator GreaterThanOrEqualToThreshold --dimensions Name=QueueName,Value=my-queue --evaluation-periods 2 --alarm-actions arn
  2. 使用以下 put-metric-alarm 命令来创建警报,如果队列中可处理的消息的数量 (ApproximateNumberOfMessagesVisible) 减少到 1,并持续 5 分钟保持小于等于 1,则该警报减小 Auto Scaling 组的大小。

    Copy
    aws cloudwatch put-metric-alarm --alarm-name RemoveCapacityFromProcessQueue --metric-name ApproximateNumberOfMessagesVisible --namespace "AWS/SQS" --statistic Average --period 300 --threshold 1 --comparison-operator LessThanOrEqualToThreshold --dimensions Name=QueueName,Value=my-queue --evaluation-periods 2 --alarm-actions arn

验证您的扩展策略和 CloudWatch 警报

您可以验证是否已创建 CloudWatch 警报和扩展策略。

验证 CloudWatch 警报

使用以下 describe-alarms 命令:

Copy
aws cloudwatch describe-alarms --alarm-names AddCapacityToProcessQueue RemoveCapacityFromProcessQueue

验证扩展策略的步骤

使用以下 describe-policies 命令:

Copy
aws autoscaling describe-policies --auto-scaling-group-name my-asg

测试扩大和缩小策略

您可以通过以下方式测试扩展策略:增加 SQS 队列中的消息数,然后验证 Auto Scaling 组是否已启动更多 EC2 实例。同样,您可以通过以下方式测试收缩策略:减少 SQS 队列中的消息数,然后验证 Auto Scaling 组是否终止了一个 EC2 实例。

测试扩展策略

  1. 请按照 Amazon SQS 入门中的步骤,向 SQS 队列添加消息。确保队列中至少有 3 条消息。

    SQS 队列指标 ApproximateNumberOfmessagesVisible 调用 CloudWatch 警报需要几分钟的时间。调用 CloudWatch 警报后,该警报会通知 Auto Scaling 策略启动 1 个 EC2 实例。

  2. 使用以下 describe-auto-scaling-groups 命令验证该组是否已启动了实例:

    Copy
    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg

测试收缩策略

  1. 请按照 Amazon SQS 入门中的步骤,从 SQS 队列删除消息。请确保队列中仅有 1 条消息。

    SQS 队列指标 ApproximateNumberOfmessagesVisible 调用 CloudWatch 警报需要几分钟的时间。调用 CloudWatch 警报后,该警报会通知 Auto Scaling 策略终止 1 个 EC2 实例。

  2. 使用以下 describe-auto-scaling-groups 命令验证该组是否已终止了实例:

    Copy
    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg