Організація подієвого обміну в Google Cloud
Уявіть: сервіс замовлень відправляє подію, а сервіс сповіщень не отримує її через таймаут RabbitMQ. Клієнт не бачить підтвердження, гроші втрачаються. При професійному налаштуванні GCP Pub/Sub такого не станеться — managed message broker гарантує at-least-once доставку з SLA 99.95% і масштабується до 1 млн повідомлень на секунду на топік без провізіонування. Ми використовуємо його в продакшені для decoupling мікросервісів, CDC-пайплайнів та fan-out подій. За 5 років роботи ми реалізували понад 50 проєктів з Pub/Sub, обробляючи до 1 млн повідомлень/сек. В одному з кейсів throughput зріс з 10 К до 500 К повідомлень/сек, а витрати на інфраструктуру знизилися на 40%. Головне: Pub/Sub — не черга з FIFO-порядком. Порядок доставки не гарантується (якщо не ввімкнути message ordering). Повідомлення можуть приходити дублями — ідемпотентність обробника обов'язкова.
Як GCP Pub/Sub вирішує проблему надійної доставки?
Pub/Sub заснований на моделі топіків та підписок. Publisher відправляє повідомлення в топік, а subscriber отримує його через підписку (pull або push). Гарантується at-least-once: повідомлення буде доставлено, але може бути дубльоване. Важливо проєктувати обробники з урахуванням цієї особливості.
Чому Schema Validation критична?
Schema validation дозволяє відбраковувати повідомлення, що не відповідають контракту, ще до доставки підписникам. Ми використовуємо AVRO-схеми — вони компактніші за JSON і підтримують еволюцію (додавання полів з default). В Terraform задається google_pubsub_schema, а на топіку включається schema_settings. Якщо повідомлення не проходить схему, воно одразу потрапляє в DLQ топіка без спроб обробки. Це знижує навантаження на consumer'ів та спрощує налагодження.
Налаштування GCP Pub/Sub: основні параметри підписок
При налаштуванні GCP Pub/Sub важливо правильно вибрати ack deadline — занадто малий викличе зайві повтори, а занадто великий — затримку. Рекомендуємо 60–120 секунд для типових обробників.
Приклад Terraform для топіка з DLQ
resource "google_pubsub_topic" "orders" {
project = var.project_id
name = "orders"
message_retention_duration = "604800s"
schema_settings {
schema = google_pubsub_schema.order.id
encoding = "JSON"
}
}
resource "google_pubsub_schema" "order" {
project = var.project_id
name = "order-schema"
type = "AVRO"
definition = file("schemas/order.avsc")
}
resource "google_pubsub_subscription" "orders_processor" {
project = var.project_id
name = "orders-processor"
topic = google_pubsub_topic.orders.id
ack_deadline_seconds = 60
message_retention_duration = "604800s"
retain_acked_messages = false
expiration_policy {
ttl = ""
}
retry_policy {
minimum_backoff = "10s"
maximum_backoff = "600s"
}
dead_letter_policy {
dead_letter_topic = google_pubsub_topic.orders_dlq.id
max_delivery_attempts = 5
}
}
resource "google_pubsub_topic" "orders_dlq" {
project = var.project_id
name = "orders-dlq"
message_retention_duration = "2592000s"
}
Dead Letter Policy критично важлива. Без неї «отруєне» повідомлення (malformed payload, яке завжди крашить обробник) буде повторно доставлятися до безкінечності, блокуючи обробку інших. DLQ перехоплює його після 5 спроб — ви отримуєте алерт і можете виправити payload.
| Параметр | Значення за замовчуванням | Рекомендація |
|---|---|---|
| ack_deadline_seconds | 10 | 60–120 для типових обробників |
| message_retention_duration | 7 днів | Збільшити до 30, якщо потрібна ретроспектива |
| max_delivery_attempts | 5 | 5–10 залежно від критичності |
| retry minimum_backoff | 10s | Підбирається під SLA |
| expiration_policy | не видаляти | Краще залишити "" для постійних підписок |
Обробка повідомлень з Python
from google.cloud import pubsub_v1
import json
def process_message(message: pubsub_v1.subscriber.message.Message):
try:
data = json.loads(message.data.decode("utf-8"))
order_id = data.get("order_id")
if not is_already_processed(order_id):
process_order(data)
mark_as_processed(order_id)
message.ack()
except Exception as e:
print(f"Error: {e}")
message.nack()
subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(PROJECT_ID, "orders-processor")
flow_control = pubsub_v1.types.FlowControl(max_messages=100)
streaming_pull_future = subscriber.subscribe(
subscription_path,
callback=process_message,
flow_control=flow_control,
)FlowControl(max_messages=100) обмежує кількість одночасно оброблюваних повідомлень. Без цього швидкий producer може заповнити пам'ять consumer'а.
Безпека: IAM та сервісні акаунти
gcloud pubsub topics add-iam-policy-binding orders \
--member=serviceAccount:[email protected] \
--role=roles/pubsub.publisher
gcloud pubsub subscriptions add-iam-policy-binding orders-processor \
--member=serviceAccount:[email protected] \
--role=roles/pubsub.subscriber Моніторинг та алертинг
Ключові метрики в Cloud Monitoring:
-
pubsub.googleapis.com/subscription/num_undelivered_messages— зростає? Consumer не справляється. -
pubsub.googleapis.com/subscription/oldest_unacked_message_age— якщо > ack_deadline, повідомлення повторно доставляються. -
pubsub.googleapis.com/subscription/dead_letter_message_count— алерт при ненульовому значенні.
При навантаженні 200 тис. повідомлень/сек num_undelivered_messages має бути близьким до нуля. Правильне налаштування алертів скорочує MTTR на 60% (за даними Google Cloud Pub/Sub documentation).
Порівняння: Pub/Sub vs Cloud Tasks vs RabbitMQ
| Характеристика | GCP Pub/Sub | Cloud Tasks | RabbitMQ (self-managed) |
|---|---|---|---|
| Тип доставки | at-least-once | at-least-once | at-most-once (можливий at-least) |
| Порядок повідомлень | Ні без ordering | Так (FIFO) | Так (черга) |
| Макс. throughput | Мільйони/сек | ~5000/сек | ~100К/сек (залежить) |
| Schema validation | Так (AVRO/JSON) | Ні | Ні |
| Dead letter queue | Вбудована | Ні | Потрібно реалізувати |
Pub/Sub виграє у швидкості та managed-зручності, Cloud Tasks — якщо потрібна дедуплікація та порядок, RabbitMQ — для самописних рішень під жорстким контролем.
Процес впровадження та терміни
Ми працюємо за етапами:
- Аналіз архітектури та вимог до подієвої моделі.
- Проєктування топіків, підписок, схем.
- Реалізація Terraform-модулів з параметрами (ack deadline, retry, DLQ).
- Інтеграція зі споживачами (pull/push).
- Налаштування моніторингу та алертів.
- Документування runbook'ів та навчання команди.
Що входить у роботу
При замовленні налаштування Pub/Sub під ключ ви отримуєте:
- Топіки та підписки з правильними параметрами (ack deadline, retry, DLQ).
- Schema validation для захисту від невалідних даних.
- IAM-ролі та сервісні акаунти.
- Terraform-код (модулі) у ваш репозиторій.
- Дашборди моніторингу в Cloud Monitoring та алерти.
- Документацію з архітектури та runbook.
- Навчання команди основам ідемпотентності та обробки помилок.
- Підтримку при запуску (1 тиждень).
Терміни: топологія з одним топіком та підписками — 1 день. Складні event-driven схеми з кількома топіками, schema validation та push-інтеграцією з Cloud Run/Functions — 2–3 дні. Вартість розраховується індивідуально.
Хочете отримати надійну подієву архітектуру? Зв'яжіться з нами для попередньої оцінки вашого проєкту. Замовте налаштування Pub/Sub під ключ — ми гарантуємо стабільну роботу при будь-яких навантаженнях.
Рекомендуємо ознайомитися з офіційною документацією Google Pub/Sub для поглибленого вивчення.







