Потоковая обработка
Streaming на собеседовании FAANG
Google, Meta, Amazon, Netflix - системный дизайн это половина FAANG-собеседования. Streaming вопросы: 'спроектируй YouTube Analytics', 'спроектируй notification system Uber', 'спроектируй Twitter feed'. У всех одна структура: Kafka + streaming processor + storage. Нужно знать trade-off - а не 'правильный' ответ.
- **Meta Scribe**: лог-агрегация через Kafka → Hadoop. 10TB/час. Notification system поверх: Kafka → Flink → push/email/SMS worker'ы
- **Twitter timeline**: гибридный push/pull feed. Redis Sorted Set для active users, pull для celebrities. Эволюция от монолита до streaming через 2012-2016
- **Airbnb Minerva**: real-time analytics pipeline. Kafka + Flink + Druid. 100M+ events/day. A/B тестирование результатов в real-time
Design: Notification System для 100M пользователей
Классический вопрос FAANG: спроектируй систему уведомлений как у Facebook или Twitter. Масштаб: 100M MAU, 1B уведомлений в день. Типы: push (mobile), email, SMS, in-app. Требования: delivery guarantee (at-least-once), latency < 1 сек для push, idempotency (нет дублей).
Почему Redis bloom filter лучше MySQL CHECK для дедупликации уведомлений на масштабе 1B/день?
Design: News Feed для социальной сети
News feed - самый частый FAANG streaming вопрос. Twitter, Instagram, Facebook: пользователь публикует пост → фид всех подписчиков обновляется. Два подхода: Push (fanout on write): при публикации записать в фид каждого подписчика. Pull (fanout on read): фид собирается в момент чтения из постов подписок. Или гибрид.
Почему Instagram использует гибридный подход (push для обычных, pull для celebrities)?
Design: Real-time Analytics Pipeline
Типичный вопрос: спроектируй систему как Google Analytics или Amplitude - трекинг событий с real-time дашбордами. 100K event/sec, latency dashboard < 30 сек. Два слоя: hot path (streaming, минуты) и cold path (batch, часы-дни). Lambda Architecture: оба пути, результаты мержатся.
Почему Lambda Architecture использует два пути (hot + cold) вместо одного?
Trade-off анализ: как отвечать на FAANG interview
FAANG interviewer не ищет 'правильный' ответ - ищет структурированное мышление. Фреймворк: (1) Clarify: масштаб, SLA, консистентность нужна? (2) High-level design: нарисовать компоненты. (3) in-depth look: trade-off на каждом слое. (4) Bottleneck analysis: где узкое место при 10x нагрузке? (5) Monitoring: что мониторить, какие алерты.
На streaming design interview нужно выбрать 'лучшую' технологию
На interview нужно объяснить trade-off: почему Kafka а не RabbitMQ, почему Flink а не Spark, почему ClickHouse а не PostgreSQL - для конкретных требований задачи
Нет 'лучшей' технологии - есть trade-off. RabbitMQ лучше для task queues (ack per message). Kafka лучше для replay, fan-out. Flink лучше для stateful streaming. Spark лучше для batch. Senior демонстрирует понимание trade-off, не священные войны
На interview спрашивают: 'что произойдёт при 10x нагрузке в вашей системе?' Какой ответ демонстрирует senior-уровень?
Связанные темы
FAANG streaming design строится на нескольких паттернах:
- CQRS Pattern — Feed: write path (Kafka fanout) и read path (Redis cache) - это CQRS
- Change Data Capture — CDC - источник событий для notification и feed систем
- Designing Systems at Scale — Backpressure и partitioning - обязательные темы в любом streaming design
Ключевые идеи
- **Notification**: Kafka fan-out → delivery workers. Redis bloom filter для dedup. Rate limiting per user. At-least-once + idempotent delivery.
- **Feed**: push (Redis Sorted Set) для обычных пользователей, pull для celebrities (>100K followers). Гибрид - стандарт.
- **Analytics**: Lambda Architecture = hot path (Flink + ClickHouse, 30 сек) + cold path (Spark + S3, часы). Оба нужны.
- **Interview фреймворк**: Clarify → High-level → in-depth look → Bottleneck 10x → Monitoring. Конкретные метрики, не абстракции.
- **Trade-off > 'правильный' ответ**: объяснить почему Kafka не RabbitMQ, когда Flink vs Spark. Это и ищет interviewer.
Вопросы для размышления
- Notification system: при падении FCM (push provider) на 30 минут - как буферизировать уведомления и избежать потери или дублирования при восстановлении?
- Feed с Redis Sorted Set: что происходит при cache miss (пользователь не заходил 30 дней)? Как построить cold cache rebuild без thundering herd?
- Lambda Architecture требует поддерживать два codebase (Flink + Spark). Когда Kappa Architecture (только streaming с replay) была бы лучше?
Связанные уроки
- stream-15 — Паттерны проектирования из предыдущего урока - основа interview решений
- stream-09 — Exactly-once - ключевое в notification и финансовых системах
- stream-11 — CQRS - стандартный паттерн в feed и notification системах
- stream-13 — CDC - типичный источник событий в notification pipeline
- ds-04-consistent-hashing — System design interview framework применяется и к streaming задачам
- dist-12-consistency