Настройка GCP Pub/Sub для надёжной доставки сообщений

Потеря событий между сервисами приводит к сбоям в бизнес-процессах и финансовым потерям. Мы настраиваем GCP Pub/Sub для гарантированной доставки сообщений, обеспечивая надёжный событийный обмен. Наша команда реализует проект под ключ: от проектирования топиков и подписок до настройки Dead Letter Queue и мониторинга, с последующей поддержкой.
Часто задаваемые вопросы

Организация событийного обмена в 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 — для самописных решений под жёстким контролем.

Процесс внедрения и сроки

Мы работаем по этапам:

  1. Анализ архитектуры и требований к событийной модели.
  2. Проектирование топиков, подписок, схем.
  3. Реализация Terraform-модулей с параметрами (ack deadline, retry, DLQ).
  4. Интеграция с потребителями (pull/push).
  5. Настройка мониторинга и алертов.
  6. Документирование 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 для углублённого изучения.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139