Модуль 2.8: Cloud Functions та Event-Driven архітектура
Складність: [MEDIUM] | Час на виконання: 2 год | Передумови: Модуль 2.4 (GCS), Модуль 2.7 (Cloud Run)
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»У березні 2020 року медична платформа мала обробляти результати аналізів у реальному часі. Результати надходили як PDF-файли в бакет Cloud Storage. Спочатку вони використовували віртуальну машину, яка кожні 30 секунд “заглядала” в бакет, шукала нові файли та обробляла їх. Це було погано з трьох причин: затримка до 30 секунд була неприпустимою для критичних аналізів; машина працювала 24/7 і коштувала $450/міс, хоча вночі нічого не відбувалося; а коли партнер випадково завантажив 15 000 файлів разом, одна машина обробляла їх 6 годин.
Вони замінили машину на Cloud Function. Тепер кожне завантаження файлу миттєво запускало функцію. 15 000 файлів були оброблені за 4 хвилини, бо Google запустив тисячі функцій одночасно. Рахунок впав із $450 до $12 на місяць.
Це і є суть Event-Driven архітектури: замість того, щоб постійно перевіряти “чи є робота?”, ваша система реагує на події, коли вони стаються. Cloud Functions — це сервіс, де ви пишете тільки код, а Google піклується про його запуск у відповідь на події.
У цьому модулі ви дізнаєтеся різницю між 1-м та 2-м поколіннями функцій, навчитеся налаштовувати тригери та побудуєте свій перший конвеєр обробки даних.
Gen 1 vs Gen 2: Що обрати?
Розділ «Gen 1 vs Gen 2: Що обрати?»Cloud Functions має два покоління. Завжди обирайте Gen 2 для нових проєктів.
| Функція | Gen 1 | Gen 2 |
|---|---|---|
| База | Спеціальне середовище | Побудовано на Cloud Run |
| Макс. час роботи | 9 хвилин | 60 хвилин |
| Конкурентність | 1 запит за раз | До 1000 запитів на екземпляр |
| Тригери | Обмежені | 100+ джерел через Eventarc |
Головна перевага Gen 2: Оскільки вона базується на Cloud Run, одна функція може обробляти багато запитів одночасно, що робить її набагато дешевшою при великому трафіку.
Типи тригерів (Trigger Types)
Розділ «Типи тригерів (Trigger Types)»Функція не працює сама по собі, її має щось “штовхнути”.
- HTTP Trigger: Прямий виклик через URL. Використовується для API або вебхуків.
- Cloud Storage Trigger: Запускається при створенні, видаленні або зміні файлу в бакеті.
- Pub/Sub Trigger: Запускається, коли в чергу повідомлень (топік) приходить нове повідомлення.
- Eventarc Trigger: Універсальний роутер подій, що дозволяє реагувати на події майже будь-якого сервісу GCP (напр. створення віртуальної машини або зміна прав доступу).
Важливе правило: Ідемпотентність
Розділ «Важливе правило: Ідемпотентність»Події в хмарі можуть доставлятися більше одного разу (at-least-once delivery). Ваша функція має бути ідемпотентною — це означає, що запуск однієї й тієї самої події двічі не повинен призводити до помилок або подвоєння даних (напр. не знімати гроші з картки двічі).
Типові помилки
Розділ «Типові помилки»| Помилка | Чоду це стається | Як виправити |
|---|---|---|
| Нескінченний цикл | Функція пише в бакет, який її ж і тригерить | Використовуйте різні папки для входу та виходу (префікси) |
| Жорстке прописання ID проєкту | ”Так швидше” | Використовуйте змінні оточення або метадані Google |
| Низький таймаут | Велика подія не встигає обробитися | Налаштуйте таймаут відповідно до найважчої задачі (до 60 хв у Gen 2) |
| Права Editor для функції | Складно розібратися в IAM | Створюйте окремий SA з мінімальними правами (напр. тільки читання GCS) |
Тест
Розділ «Тест»1. Чому Cloud Functions Gen 2 вважається кращою за Gen 1?
Тому що вона базується на Cloud Run, підтримує набагато довші таймаути (до години), більше пам’яті та дозволяє одному екземпляру обробляти багато запитів одночасно, що значно економить гроші.
2. Як запобігти "холодному старту" (cold start) у функціях Gen 2?
Встановіть параметр --min-instances=1. Це триматиме одну копію функції завжди ввімкненою, щоб перший користувач не чекав секунду на запуск середовища.
Практична вправа: Реакція на файли
Розділ «Практична вправа: Реакція на файли»- Створіть бакет для вхідних даних.
- Напишіть функцію на Python, яка просто виводить у логи ім’я файлу та його розмір.
- Деплой: Розгорніть її з тригером
google.storage.object.v1.finalizedна ваш бакет. - Тест: Завантажте файл у бакет і перевірте логи функції в консолі (Logs Explorer).
Наступний модуль
Розділ «Наступний модуль»Переходьте до Модуля 2.9: Secret Manager — ви навчитеся безпечно зберігати паролі та API-ключі, щоб вони ніколи не потрапляли у ваш код чи лог-файли.