Организация событийного обмена в 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 для углублённого изучения.







