Инженерный блог

Как мы остановили ботов: Создание системы обнаружения скликивания (Click Fraud) в реальном времени с помощью Cloud Dataflow и Pub/Sub

05.08.2026
Шарафутдинов Р.

В начале 2024 года к нам обратился крупный e-commerce клиент с классической проблемой: рекламный бюджет в Google Ads улетает за пару часов, а реальных конверсий — слезы. Мы провели аудит и обнаружили массивную атаку ботнетов (click fraud), которая мастерски маскировалась под реальных пользователей. В этой статье мы расскажем, как мы построили систему защиты реального времени на базе Google Cloud (Pub/Sub, Dataflow, Cloud Armor), которая спасла клиенту десятки тысяч долларов.

Что такое Click Fraud и почему аналитика постфактум не работает

Click Fraud — это умышленное скликивание рекламы. Бот заходит, кликает, уходит. Бюджет списывается.

Раньше мы пытались ловить таких ботов с помощью Google Analytics или анализируя логи в BigQuery в конце дня. Но проблема в том, что это аналитика постфактум. Вы узнаете о том, что вас скликивали, когда деньги уже списаны. Это как поставить сигнализацию, которая звонит вам через день после ограбления.

Нам нужна была система, которая ловит мошенников за руку. В ту же секунду. И тут на сцену выходит Stream Processing (потоковая обработка данных).

Архитектура решения: Pub/Sub + Dataflow

Чтобы обрабатывать клики в реальном времени, мы спроектировали следующую архитектуру:

  1. Load Balancer (Cloud CDN): Принимает все входящие запросы. Логи всех хитов автоматически стримятся в Pub/Sub.
  2. Pub/Sub: Играет роль брокера сообщений. Он легко проглатывает пики трафика (даже миллионы сообщений в секунду) и не падает.
  3. Cloud Dataflow (Apache Beam): Сердце нашей системы. Он забирает поток данных из Pub/Sub, группирует клики по IP-адресам (с помощью оконных функций — Windowing) и ищет аномалии.
  4. Cloud Functions + Cloud Armor: Как только Dataflow обнаруживает, что с одного IP идет 50 кликов за 10 секунд, он кидает событие, которое триггерит Cloud Function. Эта функция мгновенно добавляет IP-адрес в черный список Cloud Armor на балансировщике.

Почему именно Dataflow?

Dataflow — это fully-managed сервис в Google Cloud для выполнения пайплайнов Apache Beam. Он идеален для потоковой обработки, потому что сам масштабируется (auto-scaling) в зависимости от нагрузки. Вам не нужно думать, сколько нод поднять под Kafka или Flink. Вы пишете логику — Google Cloud делает все остальное.

Вот пример того, как мы группируем клики с помощью Sliding Windows (скользящих окон) на Python (Apache Beam):

import apache_beam as beam
from apache_beam.transforms.window import SlidingWindows

# Пайплайн обработки потока из Pub/Sub
def run():
    with beam.Pipeline(options=pipeline_options) as p:
        (
            p
            | 'ReadFromPubSub' >> beam.io.ReadFromPubSub(subscription=my_sub)
            | 'ExtractIP' >> beam.Map(lambda msg: (msg.attributes['client_ip'], 1))
            | 'WindowInto' >> beam.WindowInto(SlidingWindows(size=10, period=5))
            | 'CountPerIP' >> beam.CombinePerKey(sum)
            | 'FilterAnomalies' >> beam.Filter(lambda kv: kv[1] > 50)
            | 'TriggerBlock' >> beam.ParDo(BlockIPFunction())
        )

В этом коде мы читаем из Pub/Sub, извлекаем IP, разбиваем поток на 10-секундные окна (которые сдвигаются каждые 5 секунд). Если количество кликов с одного IP превышает 50 — мы триггерим блокировку. Просто, как автомат Калашникова, и так же надежно.

Кейс: Как мы спасли $20,000 за выходные

Один из наших клиентов запустил масштабную кампанию в пятницу вечером. Почти сразу после старта графики в мониторинге сошли с ума: CTR (Click-Through Rate) взлетел до небес, конверсий — ноль. Трафик шел с тысяч разных IP-адресов.

Если бы у них была старая система (анализ логов раз в час), они бы слили весь бюджет кампании к утру субботы. Но наша связка Pub/Sub + Dataflow отработала идеально.

Система начала детектить аномальные паттерны: хотя IP-адреса были разными (DDoS/ботнет), они использовали один и тот же устаревший User-Agent и делали клики с ровным интервалом в 1.5 секунды. Мы оперативно обновили пайплайн Dataflow (выкатив новую версию стримы), добавив фильтрацию не только по IP, но и по комбинации IP + User-Agent + BehaviorPattern.

В результате Cloud Armor заблокировал более 40,000 IP-адресов из ботнета в течение 2 минут. Атака захлебнулась, а бюджет клиента был спасен.

Инсайты и Советы (Tips & Tricks)

  • Не бойтесь Windowing: Понимание оконных функций (Fixed, Sliding, Session windows) — это суперсила дата-инженера. Session Windows отлично подходят для анализа пользовательских сессий, а Sliding Windows — для детектирования спайков (пиков) нагрузки.
  • Watermarks (Ватермарки): В стриминге данные часто приходят с опозданием. Настройте правильные Watermarks и механизмы обработки Late Data в Apache Beam, чтобы не терять клики, которые "застряли" в сети.
  • Стоимость Dataflow: Он может быть дорогим, если вы стримите каждую мелочь. Оптимизируйте пайплайны: фильтруйте мусор на самых ранних этапах (сразу после чтения из Pub/Sub).
  • Cloud Armor: Идеально работает в связке с Load Balancer. Не пытайтесь блокировать IP на уровне приложения (в коде) — это убьет ваш CPU. Блокируйте на краю сети (Edge).

Метрики и Бенчмарки

Давайте посмотрим на графики. Мы сравнили время реакции старой системы (batch processing) и новой системы (stream processing).

Время реакции на атаку (Сек)

Сравнение старой batch-системы (Cron + BQ) и новой stream-системы (Dataflow).

Как видно из графика, стриминговая архитектура снизила среднее время реакции на атаку с 60 минут (анализ батчей) до невероятных 1.5 секунд. Ботнет блокируется еще до того, как успевает нанести существенный финансовый урон.

Ниже представлена статистика заблокированных запросов во время инцидента. Вы можете видеть, как Cloud Armor отсек 99% вредоносного трафика в первые минуты.

Количество заблокированных ботов

Динамика блокировок подозрительных IP в Cloud Armor за первые минуты атаки.

Заключение

Stream processing — это не просто красивый баззворд. Это необходимость в современном вебе, где ботнеты становятся все умнее. Связка Pub/Sub + Dataflow + Cloud Armor — это enterprise-grade решение, которое окупает себя при первой же серьезной атаке.

Если ваш бюджет тает из-за скликивания, а аналитика не дает ответов — возможно, пришло время переходить на стриминг. Обращайтесь в лабораторию ОЗАТ, и мы построим надежный щит для вашего бизнеса!

Рустам Шарафутдинов

Рустам Шарафутдинов

Автор инженерного блога

Эксперт в области архитектуры Google Cloud и Senior Full-Stack разработчик с более чем 15-летним опытом. Специализируется на отказоустойчивых архитектурах, оптимизации высоконагруженных проектов и интеграции AI (Vertex AI).

Экспертность: GCP, Kubernetes, Микросервисы, React, Node.js

Комментарии (0)