Перейти до вмісту

Модуль 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 1Gen 2
БазаСпеціальне середовищеПобудовано на Cloud Run
Макс. час роботи9 хвилин60 хвилин
Конкурентність1 запит за разДо 1000 запитів на екземпляр
ТригериОбмежені100+ джерел через Eventarc

Головна перевага Gen 2: Оскільки вона базується на Cloud Run, одна функція може обробляти багато запитів одночасно, що робить її набагато дешевшою при великому трафіку.


Типи тригерів (Trigger Types)

Розділ «Типи тригерів (Trigger Types)»

Функція не працює сама по собі, її має щось “штовхнути”.

  1. HTTP Trigger: Прямий виклик через URL. Використовується для API або вебхуків.
  2. Cloud Storage Trigger: Запускається при створенні, видаленні або зміні файлу в бакеті.
  3. Pub/Sub Trigger: Запускається, коли в чергу повідомлень (топік) приходить нове повідомлення.
  4. 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. Це триматиме одну копію функції завжди ввімкненою, щоб перший користувач не чекав секунду на запуск середовища.


Практична вправа: Реакція на файли

Розділ «Практична вправа: Реакція на файли»
  1. Створіть бакет для вхідних даних.
  2. Напишіть функцію на Python, яка просто виводить у логи ім’я файлу та його розмір.
  3. Деплой: Розгорніть її з тригером google.storage.object.v1.finalized на ваш бакет.
  4. Тест: Завантажте файл у бакет і перевірте логи функції в консолі (Logs Explorer).

Переходьте до Модуля 2.9: Secret Manager — ви навчитеся безпечно зберігати паролі та API-ключі, щоб вони ніколи не потрапляли у ваш код чи лог-файли.