У меня есть небольшой конкретный пример использования c. Мне нужно автоматически масштабировать распределенное веб-приложение, работающее на ECS Fargate. Подвох заключается в том, что все узлы должны хранить в памяти одни и те же данные (поэтому увеличение количества узлов не помогает при нагрузке на память). Таким образом, увеличивающаяся нагрузка может быть правильно обработана только в том случае, если она масштабируется как по горизонтали (добавление узлов), так и по вертикали (увеличение памяти узлов).
Горизонтальное автоматическое масштабирование очень просто. AWS CDK предоставляет хорошие высокоуровневые конструкции для задач Fargate с балансировкой нагрузки и позволяет очень просто добавлять дополнительные задачи для обработки нагрузки на процессор:
service = aws_ecs_patterns.ApplicationLoadBalancedFargateService(
self,
'FargateService',
cpu=256,
memory_limit_mib=512,
...
)
scalable_target = service.service.auto_scale_task_count(max_capacity=5)
scalable_target.scale_on_cpu_utilization('CpuScaling', target_utilization_percent=60)
То, что я ищу, это вертикальное масштабирование часть. На данный момент моя лучшая идея заключается в следующем:
- Создать тревогу CloudWatch для использования памяти кластером. Запуск более 60%.
- Сигнал тревоги отправляет сообщение SNS topi c, которое запускает лямбда-функцию.
- Лямбда описывает текущее определение задачи и анализирует параметры процессора и памяти , Затем он создает новую версию определения задачи с увеличенной памятью (и ЦП, если это необходимо, поскольку ЦП и память не являются независимыми значениями в Fargate).
- Наконец, лямбда-код обновляет службу новым определением задачи. Это должно запустить непрерывное обновление и привести к кластеру с таким же числом узлов, но каждый с большей памятью.
Как вы думаете, это может работать? Есть ли лучшее решение? Любые потенциальные проблемы, которые вы можете обнаружить?
Заранее спасибо за любые идеи!