> Почему Pulsar не может достичь такого же уровня масштабируемости как Kafka (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: sferaplatform.ru
Стек: Go
> Пример ответа
Короткий ответ
Pulsar и Kafka имеют принципиально разные архитектуры хранения: Kafka использует локальные диски брокеров, а Pulsar - отдельный слой bookies (Apache BookKeeper). Масштабируемость Kafka ограничена репликацией и партиционированием на уровне брокеров, тогда как Pulsar разделяет compute и storage, что позволяет масштабировать их независимо. Однако на практике Pulsar уступает Kafka в пропускной способности на один брокер из-за дополнительного сетевого hop и накладных расходов на запись в BookKeeper.
Подробное объяснение
Ключевое различие - в модели хранения и репликации.
Kafka: каждый брокер хранит партиции на локальных дисках. Репликация - это копирование логов между брокерами через fetch-запросы. Масштабирование достигается добавлением брокеров и перераспределением партиций. Ограничения:
- партиция привязана к конкретному брокеру, её размер ограничен диском этого брокера;
- ребалансировка при добавлении брокера - долгая операция, требующая копирования данных;
- рост числа партиций увеличивает overhead на фоновые операции (replication, metadata sync).
Pulsar: данные пишутся в BookKeeper - распределённое журналируемое хранилище. Брокеры Pulsar не хранят данные, они лишь управляют метаданными и обслуживают клиентские подключения. Bookies образуют отдельный кластер, который горизонтально масштабируется независимо. Это даёт:
- эластичное масштабирование storage без ребалансировки партиций;
- возможность добавлять брокеры без перемещения данных;
- отдельное масштабирование чтения и записи.
Почему же Pulsar не достигает уровня Kafka по масштабируемости в бенчмарках:
-
Сетевой overhead: каждая запись идёт от producer → брокер → bookie (и реплики bookies). Kafka пишет на локальный диск, что быстрее.
-
Задержки подтверждения: Kafka подтверждает запись после fsync на всех in-sync replicas. Pulsar - после записи в кворум bookies, что требует больше сетевых round-trips.
-
Пропускная способность на брокер: брокер Pulsar - это прокси, он не использует page cache напрямую, в отличие от Kafka, где чтение идёт из кэша ОС.
-
Сложность операций: BookKeeper требует отдельной настройки, мониторинга и тюнинга. При неправильной конфигурации (например, недостаточное число bookies) производительность резко падает.
-
Протокол репликации: Kafka использует простой leader-follower с fetch-based репликацией, что эффективно для последовательных логов. BookKeeper использует quorum-based запись (write to N/2+1), что даёт больше latency при малых кластерах.
Однако важно уточнить: Pulsar масштабируется лучше в сценариях с очень большим числом партиций и длительным хранением данных, потому что storage отделён. Kafka упирается в лимиты дисков брокеров. Но в типичных нагрузках (высокий throughput, умеренное число партиций) Kafka выигрывает.
На практике
Для senior-позиции важно показать понимание trade-off, а не просто заученные факты. Практические следствия:
- если нужен максимальный throughput на кластер при фиксированном числе брокеров - Kafka;
- если нужна эластичность storage и многотемность с тысячами партиций - Pulsar;
- если важна мультитенантность и изоляция - Pulsar из коробки;
- если команда уже умеет эксплуатировать Kafka - переход на Pulsar не даст выигрыша без явной потребности.
Также стоит упомянуть, что современные версии Kafka (3.x+) улучшили масштабируемость через KRaft (убрали ZooKeeper), но архитектурное ограничение локального хранения осталось.
Пример кода
Пример не требуется, так как вопрос концептуальный. Но можно упомянуть, что в Go-проектах выбор драйвера (franz-go для Kafka, pulsar-client-go для Pulsar) не влияет на архитектурные ограничения.
Как отвечать на собеседовании
- Начни с короткого тезиса: "разные архитектуры хранения".
- Объясни разницу: локальные диски vs отдельный storage слой.
- Перечисли конкретные причины: сетевой hop, quorum writes, отсутствие page cache.
- Уточни, что масштабируемость - это не только throughput, но и эластичность, число партиций, операционная сложность.
- Приведи пример, когда Pulsar объективно лучше (много партиций, долгое хранение).
- Заверши выводом: "Kafka выигрывает в throughput на брокер, Pulsar - в гибкости масштабирования storage".
Что проверяет интервьюер
- понимание внутреннего устройства обоих систем;
- способность сравнивать не по маркетинговым заявлениям, а по архитектуре;
- умение видеть trade-off, а не искать "лучшую" систему;
- знание практических ограничений (сетевые задержки, quorum, page cache);
- способность объяснить сложное простыми словами.
Типичные ошибки
- утверждение "Pulsar вообще не масштабируется" - неверно, он масштабируется иначе;
- игнорирование роли BookKeeper - без него ответ неполный;
- сравнение только по throughput, без учёта числа партиций и хранения;
- забыть про сетевой overhead и quorum writes как ключевые причины;
- утверждение, что Kafka не имеет ограничений - это тоже ошибка, ограничения есть, просто другие.
> Похожие задачи по backend
Как бороться с большими объемами данных в запросах, например шардирование
Почему запрос с индексами может тормозить и как это решать
Почему Kafka такая быстрая
Могут ли процессы и потоки общаться между собой и как
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью