Бросьте в атаку армию из тысяч AWS Lambda functions за секунды
Неожиданная проблема параллелизма лямбда функций
Для одного научного вычисления нам потребовалось быстро вычислить тысячи маленьких функций.
AWS лямбда функции выглядят идеальным выбором, не так ли?
Мы рассчитывали получить результат за несколько секунд. Каждая функция занимает 5-6 секунд, поэтому мы не ожидали никаких проблем.
Я написал простой PoC на основе SQS и Lambda. Однако для завершения задания с расчетом менее чем 1000 функций потребовалось 20 минут.
Хорошо, я переписал код с использованием Step Functions и состояния “map”. И снова - 20 минут.
Хм. Я прочитал мелкий шрифт в документации AWS и обнаружил, что “map” в Step Functions, а также SQS Lambda запускают 40 экземпляров функций Lambda каждую минуту. Так что, если вам нужно вычислить 1000 функций, то займет 1000/40 = 25 минут.
Решение
Когда вы понимаете проблему, решение становится очевидным.
Некоторые разработчики используют рекурсивное состояние “map” в Step Functions.
Но в нашем случае мы просто создали лямбда функцию, которая запускает 1000 параллельных рабочих лямбда функций.
Результат работал сногсшибательно быстро.
Кстати, если вам нужно больше 1000 экземпляров функций параллельно, вы можете обратиться в службу поддержки AWS, чтобы увеличить квоту. Это бесплатно.