7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SQSに大量のキューが入ったらコンシューマーをオートスケールしたい

Last updated at Posted at 2018-08-18

やりたいこと

不定期でSQSにキューが登録され、コンシューマーのEC2にはバッチ処理がSQSのキューを常にポーリングしており、バッチ処理はデキューに成功したら業務処理を行います。

普段、起動しているコンシューマーのEC2は1台だけなので、プロデューサーが一度に大量のエンキューを行なった場合は、キューの数に比例した時間がかかります。しかし、大量のキューであったも、コンシューマーは全てのキューの処理を終えなくてはなりません。

Auto Scaling グループを作成してコンシューマーのEC2の台数を適宜調整すればいいのですが、手動でAuto Scaling グループの「希望」台数を調整するのは事故の元なので大量のキューが登録されたら、自動でスケールアウトして、未処理のキューがなくなったらスケール・インさせます。

HOW TO

素直に公式ドキュメントに沿って設定します。

Amazon SQS に基づくスケーリング
https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/as-using-sqs-queue.html

キューの数に応じて、コンシューマーの台数を変更したい(ダメだった)

例えば、10,000以上のキューなら4台、20,000以上のキューなら8台、30,000以上なら12台といった要領で、オートスケールの台数を変えたいとおもいました。

スケーリング調整タイプがExactCapacity の場合

ExactCapacityは スケールアウト後の台数を指定する方法です。

指定したインスタンス数にグループの現在の容量を変更します。この調整タイプには正の値を指定します。
例: グループの現在の容量が 3 インスタンスであり、調整値が 5 の場合、このポリシーが実行されると、容量は 5 インスタンスに設定されます。

https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/as-scaling-simple-step.html#as-scaling-adjustment より

プロデューサーが一度に大量のキューを登録した後に、CloudWatchのアラームが検知してスケールアウトしてEC2の台数が希望した通りになりました。

しかし、コンシューマーが処理を行い続け、キューの数が減り、一つ下のステップの範囲に達するとコンシューマーの数も減ってしまいました。例えば、 スケールアウトの開始時点ではキューの数が17,000件であれば、コンシューマーが8台になります。その後、キューの数が 10,000未満まで減ると下の4台に減りました。最後の0件になるまで8台で処理を行って欲しかったのです。

スケーリングポリシーは下の表の通りです。

| 追加/削除/設定 | 台数| 閾値下限 | メトリクス名 | 閾値上限 |
| ------------ | --- | ------- | --- | ---------- | --- | ------- |
| 設定 | 1 | 1 | <= ApproximateNumberOfMessagesVisible < | 9999 |
| 設定 | 4 | 1000 | <= ApproximateNumberOfMessagesVisible < | 19999 |
| 設定 | 8 | 2000 | <= ApproximateNumberOfMessagesVisible < | 29999 |
| 設定 | 12 | 3000 | <= ApproximateNumberOfMessagesVisible < | 無限大 |

スケーリング調整タイプがChangeInCapacity の場合

ChangeInCapacityは スケールアウト時に増やす台数を指定します。

指定したインスタンス数だけグループの現在の容量を増減させます。正の調整値は現在の容量を増やし、負の調整値は現在の容量を減らします。
例: グループの現在の容量が 3 インスタンスであり、調整値が 5 の場合、このポリシーが実行されると、グループに 5 インスタンスを追加して、合計で 8 インスタンスになります。

https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/as-scaling-simple-step.html#as-scaling-adjustment より

ExactCapacityのスケーリングポリシーを「設定」から「追加」に変更して試しました。プロデューサーが1,900のキューを登録した場合は4台増え、常に起動させている1台と合わせて5台になりました。その後クールダウンタイムが終わった時点で、キューの数が1,000 を超えていると、4台が追加で起動して合計9台になりました。その後も、同様に増え続けて Auto Scaling グループ の 最大キャパシティに達した所で、増えるのが止まりました。

結局

プロデューサーが1回の処理で投入したキューの数に応じてコンシューマーの台数を固定することを諦め、常に最大キャパシティまでスケールアウトすることにしました。

断念した時に公式ドキュメントが簡易スケーリングポリシーを扱っている理由を理解しました。

実現するのであれば、プロデューサーがAuto Scaling グループの最大を調整する仕組みが必要そうです。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?