Lambda не сделана для параллелизма - но Go все еще выполняет работу

Lambda не сделана для параллелизма - но Go все еще выполняет работу

4 августа 2025 г.

Идтихорошо известен тем, как он поддерживает и моделирует параллелизм в своей экосистеме. Предоставление конструкций, какКаналыВWaitgroupsиGoroutinesЧтобы создать параллельные программы.

Одна вещь, которая заинтриговала меня, это то, как это будет работать в системе без серверов; в этом случае конкретноAWS LambdasПолем

  • Ваше время выполнения не долго проживается, длится только до тех пор, пока ваша функция работает
  • Вы не хотите, чтобы фоновые goroutines их убили, как только главный обработчик вернется
  • Давайте не будем забывать о вычислительных затратах, которые складываются, тем дольше они работают
  • Основное распределение при запуске Lambdas не прозрачна

Это ограничение действительно имеет значение?Goroutines не отображается напрямую в потоках ОС, поэтому вы все равно можете разработать свой код для выполнения одновременно. Перемещая блокировку, вводимым/выводам задачи в Goroutines, вы можете разблокировать улучшения производительности, делая операции одновременными и не блокирующими; Так же, как Nodejs обрабатывает асинхронные задачи.

Прежде чем погрузиться глубже, давайте убедитесь, что этот подход действительно работает, как и ожидалось, на AWS Lambda. Демонное время:

https://gist.github.com/gokulchandra/7ddd864d940d3776120c03bfeec0032e?embedable=true

Запуск этого кода в качестве AWS Lambda подтверждает, что, независимо от выделенных ядер ЦП, вы можете выполнять параллельные программы на Lambda (или любое время выполнения без сервера). Поскольку Lambda не позволяет вам явно выбирать основное количество, я проверил это в нескольких конфигурациях памяти.

  • 128 МБ
  • 512 МБ
  • 1024 МБ

Выходы были одинаковыми в нескольких терминах того, насколько одновременным было выполнение. Образцы журналов ниже:

START RequestId: 4dfaf7ca-9981-4b2a-a50c-099d7dd4c1b2 Version: $LATEST
placing order: deli pizza for table: 4
processing order: deli pizza for table: 4
delivering order: deli pizza for table: 4
placing order: pepperoni pizza for table: 1
processing order: pepperoni pizza for table: 1
delivering order: pepperoni pizza for table: 1
placing order: veggie pizza for table: 2
processing order: veggie pizza for table: 2
delivering order: veggie pizza for table: 2
placing order: pepperoni pasta for table: 3
processing order: pepperoni pasta for table: 3
delivering order: pepperoni pasta for table: 3
END RequestId: 4dfaf7ca-9981-4b2a-a50c-099d7dd4c1b2
REPORT RequestId: 4dfaf7ca-9981-4b2a-a50c-099d7dd4c1b2 Duration: 1.35 ms Billed Duration: 2 ms Memory Size: 1024 MB Max Memory Used: 21 MB 

Стоит ли использовать Goroutines внутри Lambda?

ДляЗадачи процессора, Создание многих goroutines (например, 100) обычно обеспечивает небольшую пользу. Они будут временными на одном VCPU, выделенном на лямбду. Lambda выделяетсяМощность процессора на основе памятиНапример, ~ 1 VCPU для 1769 МБ памяти.

Использование параллелизма внутри одного лямбдамасштабные рабочие нагрузкипобеждает цель Ломбды. AWS уже обрабатывает горизонтальное масштабирование, выполняя несколько параллельных выполнений.

Goroutines полезны для задач ввода/вывода.(HTTP -вызовы, DB -запросы, операции S3). Они позволяют вам запускать эти операции параллельно в течение одного запроса. Это может уменьшить задержку и повысить пропускную способностьбез дополнительных затратПолем

Ключевые соображения

  1. Короткометражный и без гражданства:Если Goroutines все еще работают после возврата обработчика, они будут прекращены.
  2. Холод начинается:Больше параллелизма в одной функции может означать большие двоичные файлы и более длительные запуска.
  3. Модель биллинга:Lambda заряжает за время выполнения функции, а не на Goroutine. Разделение работ на множественных призыве лямбды часто дешевле и масштабируется более эффективно.
  4. Обработка ошибок:Паника в Goroutines не автоматически терпит неудачу в Lambda, если не обработано явно, что может привести к молчаливым сбоям.

Ссылки

  • Настроить память функции лямбда
  • Здание Go Lambdas
  • Параллелизм - это не параллелизм Роб Пайк


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE