You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改ECS目标跟踪策略,实现0实例时队列有任务即扩容?

问题解决方案

一、实现MinCapacity=0时的即时扩容

目标跟踪策略的核心逻辑是基于指标与目标值的差距调整实例数,当MinCapacity设为0时,只有当队列任务数远超目标值才会触发扩容,无法做到有1个任务就启动实例。要解决这个问题,需要结合两种缩放策略:

1. 修改原目标跟踪策略的最小容量

保留原策略用于正常运行时的扩缩逻辑,仅将ScalableTarget的MinCapacity改为0:

AutoScalingDefaultWorkerTarget:
  Type: AWS::ApplicationAutoScaling::ScalableTarget
  Properties:
    MinCapacity: 0  # 调整为0
    MaxCapacity: 8
    ResourceId: !Join
      - "/"
      - - "service"
        - !Ref ECSCluster
        - !GetAtt DefaultWorkerService.Name
    ScalableDimension: ecs:service:DesiredCount
    ServiceNamespace: ecs
    RoleARN: 
      Fn::Sub: "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService"

2. 添加步进缩放策略实现从0扩容

单独创建基于CloudWatch告警的步进缩放策略,触发条件为「队列任务数≥1且ECS服务期望任务数=0」,直接启动1个任务:

步进缩放策略配置

AutoScalingDefaultWorkerStepScalingPolicy:
  Type: AWS::ApplicationAutoScaling::ScalingPolicy
  Properties:
    PolicyName: default-worker-step-scaling-policy
    PolicyType: StepScaling
    ScalingTargetId: !Ref AutoScalingDefaultWorkerTarget
    StepScalingPolicyConfiguration:
      AdjustmentType: ChangeInCapacity
      StepAdjustments:
        - MetricIntervalLowerBound: 0
          ScalingAdjustment: 1  # 直接增加1个任务实例
      Cooldown: 60  # 避免短时间内重复触发

关联CloudWatch复合告警

创建CloudWatch告警,同时满足以下两个条件时触发上述步进策略:

  • 自定义指标App-Queues/default-worker-nr-jobs-avg的平均值≥1
  • ECS服务的ecs:service:DesiredCount指标等于0

这样就能实现:当没有运行的Sidekiq任务时,只要队列里有1个任务就立即启动1个实例。

二、关于AWS Batch与Sidekiq的兼容性

你的判断是正确的:AWS Batch不适合运行Sidekiq,原因如下:

  • AWS Batch针对一次性、短运行的批处理任务设计,任务执行完成后会自动终止容器
  • Sidekiq是长运行进程,需要持续监听Redis队列等待新任务,Batch的任务生命周期模型无法满足这一需求——即使Sidekiq处理完当前任务,Batch也会直接终止容器,无法持续监听
  • 两者的调度逻辑不匹配,Batch无法适配Sidekiq的队列消费、任务分发机制

内容的提问来源于stack exchange,提问作者Aurel Drejta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:27:54