Якщо ви хочете побудувати безсерверну архітектуру в AWS або принаймні її частину, тоді сервіс AWS Lambda буде найважливішою частиною цього.
Це безсерверна обчислювальна функція (зазвичай написана на мові програмування Node.JS або Python), яку можна розробляти та запускати без запуску серверних кластерів або серверів. Ви можете підключити кілька функцій AWS Lambda для створення більш складних процесів.
Однак важливою властивістю лямбда-функції є її обмеження щодо тривалості часу обробки. Це зрештою визначає, коли це правильна мета використання функції AWS Lambda.
Джерело: aws.amazon.com
Що таке інтервал очікування?
Функція тайм-ауту функції AWS Lambda – це параметр, який визначає максимальний проміжок часу, протягом якого функція може працювати до її завершення.
Лямбда-функції створені як короткочасні та без стану, і саме так їх слід використовувати. Нерідко можна спостерігати, як команди намагаються використовувати функцію Lambda для тривалих процесів. Вони роблять це лише тому, що хочуть скористатися перевагами безсерверної природи AWS Lambda. Завжди набагато дешевше запускати код без необхідності запускати сервер із певною конфігурацією процесора та пам’яті. Отже, намір легко зрозуміти.
Однак якщо функція працює надто довго, це може спричинити проблеми з використанням ресурсів і продуктивністю. Ви ризикуєте заблокувати ресурси, а оскільки у вас є перевага тривалого процесу, швидше за все, ви не дуже дбаєте про оптимізацію кроків усередині процесів. Раптом час очікування в п’ять хвилин не є великою проблемою. Ви можете дозволити собі залишити його наявним, навіть якщо для самого процесу він може бути марним.
За замовчуванням час очікування для функції Lambda встановлено лише на 3 секунди. У цьому випадку вам доведеться розраховувати на те, що будь-який код, який ви виконуєте всередині функції Lambda, повинен завершитися протягом трьох секунд. Це чудово, якщо ви хочете побудувати архітектуру з дуже швидкою комунікацією та часом відповіді, потенційно з мільйонами транзакцій за дуже короткий час. Але це значно обмежило б варіанти використання функції Lambda, тому ви можете збільшити цей ліміт максимум до 900 секунд (15 хвилин). Коли цей час очікування досягнуто, Lambda припинить роботу функції та поверне код помилки.
Як налаштувати функцію тайм-ауту?
Джерело: aws.amazon.com
Ви можете встановити час очікування для функції Lambda за допомогою консолі керування AWS, інтерфейсу командного рядка AWS або пакетів SDK AWS.
Ось конкретні кроки, як цього досягти:
Ви також можете використовувати командний рядок AWS CLI, щоб оновити час очікування функції Lambda. Ось приклад команди:
<code>aws lambda update-function-configuration --function-name [My_Lambda_Function_Name] --timeout 900
Ця команда встановлює час очікування для [My_Lambda_Function_Name] до 15 хвилин. Просто введіть своє справжнє ім’я функції та бажане значення часу очікування в секундах.
Деякі міркування
Налаштування тайм-ауту застосовується до всієї функції, а не лише до окремих блоків коду чи операцій у функції. Отже, якщо ваша функція виконує тривалу операцію, таку як обробка великого файлу або здійснення мережевого запиту, вам потрібно переконатися, що часу очікування все ще достатньо для завершення операції, навіть у найгіршому випадку .
Варто зазначити, що лямбда-функції розроблені як короткочасні та без стану. Вони призначені для виконання невеликих дискретних завдань. Якщо ви виявите, що для виконання вашої функції Lambda потрібно багато часу, можливо, варто розглянути можливість розбиття її на кілька менших функцій. Потім ви можете викликати їх один за іншим за допомогою тригера. Наприклад, якщо вихідні дані попередньої функції Lambda зберігаються в певному сегменті S3.
Крім того, якщо вам потрібно запустити тривалий процес, який перевищує 15-хвилинний ліміт, ви можете розглянути можливість використання покрокових функцій AWS для оркестрування серії функцій Lambda або інших служб AWS для досягнення бажаного результату.
Кращі практики
Робочий інтервал самого тайм-ауту, здається, недостатній для якихось розширених розмов. У більшості випадків розробники встановлюють 15 хвилин для всіх функцій Lambda. Навіть якщо функція завершиться набагато раніше, негативного побічного ефекту від цього немає.
Тим не менш, є кілька найкращих практик, на які варто звернути увагу.
#1. Визначте відповідне значення
Ви повинні встановити значення часу очікування на основі очікуваного часу виконання функції. По суті, це означає встановити значення, яке не є надто коротким, але також і не надто довгим.
Ви можете переконатися, що загальний час однієї функції Lambda не перевищує трьох хвилин, наприклад, лише через архітектурні причини чи причини загальної продуктивності вашої програми.
Подібним чином ви можете переконатися, що функція Lambda не закінчиться раніше ніж, скажімо, через три хвилини. Одна з причин може полягати в тому, що ви бажаєте заповнити певну кількість повторів у лямбда-коді. Наприклад, якщо деякі ресурси, необхідні для завершення коду, зайняті або заблоковані.
Тож перш ніж продовжувати та встановлювати тайм-аут до 15 хвилин, подумайте про оптимальне значення часу виконання. Визначення більш точних значень є лише ще одним інструментом, щоб встановити деякі межі для всієї команди розробників.
#2. Моніторинг у часі
Після того, як ви встановите обмеження часу очікування, спробуйте відстежувати час виконання ваших функцій Lambda. Це дасть вам важливу інформацію про те, чи було початкове рішення правильним чи потребує певних коригувань.
Ви можете використовувати показники та журнали CloudWatch, щоб відстежувати час виконання функцій. Потім визначте ті, які займають більше часу, ніж очікувалося, а також ті, які виконуються набагато швидше, ніж очікувалося.
#3. Асинхронний виклик
Якщо ваша лямбда-функція запускається подією, яка не потребує негайної відповіді, наприклад, завантаження файлу або повідомлення з черги, використовуйте асинхронний виклик, щоб зменшити ризик очікування. Це змусить функцію працювати у фоновому режимі, не чекаючи відповіді. Звичайно, це може призвести до зменшення кількості тайм-аутів. Це просто тому, що вам не потрібно включати в загальний час виконання Lambda час очікування, який необхідний функції для цього ресурсу.
#4. Використовуйте покрокові функції для складних процесів
Якщо вам потрібно запустити тривалий процес, який перевищує 15-хвилинний ліміт, ви можете використовувати AWS Step Functions, щоб організувати ряд функцій Lambda або інших служб AWS для досягнення цього результату. Функція Step розбиває процес на менші завдання, які можна виконати в межах часу очікування.
Ви навіть можете запускати кілька лямбда-функцій паралельно в межах покрокової функції. Потім нехай функція step чекає всіх паралельних лямбда-функцій, перш ніж продовжити. Це форма горизонтального масштабування, де кілька лямбда-функцій можуть розділити одну проблему та частково вирішити її разом.
Зрештою, вам просто потрібно зібрати часткові результати та створити остаточну роздільну здатність, для якої може бути достатньо однієї наступної автономної лямбда-функції.
#5. Оптимізуйте код
Ви можете оптимізувати свій код функції Lambda, щоб скоротити час виконання та підвищити продуктивність. Це корисно, якщо інтервал часу очікування недостатній лише зрідка. У такому випадку, можливо, варто пошукати оптимізацію коду, щоб усунути такі випадки помилок.
Як час очікування впливає на виставлення рахунків?
Джерело: aws.amazon.com
Налаштування часу очікування для функції AWS Lambda безпосередньо не впливає на виставлення рахунків за цю функцію. AWS Lambda виставляє рахунки на основі кількості запитів і тривалості часу виконання функції.
Якщо ви збільшите час очікування для функції Lambda, це може призвести до довшого часу виконання. Але лише якщо функція справді потребує додаткового часу. Якщо поєднати це з вищою частотою виконання функції, яка вимагає більше часу, тоді так, ви можете очікувати вищих витрат.
Однак, якщо функція не викликається часто або якщо вона завершує процес раніше, ніж досягається значення тайм-ауту, вплив на виставлення рахунків може бути мінімальним.
Ось чому налаштування всіх функцій Lambda на тайм-аут 15 хвилин за замовчуванням може не бути основною причиною збільшення вартості вашої загальної обробки.
Однак це, безперечно, призводить до непрямого збільшення загальних витрат. Розробники відчують, що у них є певний резерв для використання, і вони можуть не оптимізувати код до такої міри, якби це зробили, якби тайм-аути були більш обмежувальними, але все ж реалістичними.
Інша справа, що AWS Lambda надає безкоштовний рівень, який включає 1 мільйон безкоштовних запитів і 400 000 ГБ-секунд обчислювального часу на місяць. Якщо ваше використання функції Lambda потрапляє в межі безкоштовного рівня, ви не будете платити за час виконання функції незалежно від налаштування часу очікування.
Заключні слова
Функція AWS Lambda є потужним інструментом, особливо для безсерверної обробки в хмарі AWS. Він має свою мету та межі, про які ми повинні знати. Не намагаймося використовувати його для тих випадків, для яких він не розроблений.
Він ідеально підходить для простих, асинхронних і ідеально активованих дій, які не вимагають часу виконання більше 15 хвилин. Якщо вам потрібно щось складніше, скористайтеся покроковими функціями AWS, щоб об’єднати кілька лямбда-функцій в один організований процес. Або відмовтеся від дешевшої безсерверної обробки та використовуйте сервери з відповідною конфігурацією та обчислювальною потужністю для виконання свого завдання.
Далі перегляньте вступ до AWS Lambda для початківців.