Узнайте, что такое Apache Kafka, как работают топики и партиции и где Kafka применяется в современных системах для событий в реальном времени, логов и конвейеров данных.

Apache Kafka — это распределённая платформа для потоковой передачи событий. Проще говоря, это общий долговечный «трубопровод», который позволяет множеству систем публиковать факты о том, что произошло, а другим системам — читать эти факты быстро, в масштабе и в порядке.
Команды используют Kafka, когда данные нужно перемещать надёжно между системами без тесной связки. Вместо того чтобы одно приложение напрямую вызывало другое (и терпело неудачу, если оно упало или стало медленным), продюсеры записывают события в Kafka. Потребители читают их, когда готовы. Kafka хранит события в течение настраиваемого периода, так что системы могут восстановиться после сбоев и даже переработать историю.
Это руководство для инженеров, ориентированных на продукт, специалистов по данным и технических лидеров, которые хотят практическую ментальную модель Kafka.
Вы узнаете основные строительные блоки (producers, consumers, topics, brokers), как Kafka масштабируется с помощью партиций, как она хранит и воспроизводит события и где она вписывается в событийно-ориентированную архитектуру. Мы также рассмотрим типичные сценарии использования, гарантии доставки, основы безопасности, планирование эксплуатации и когда Kafka — (или не) подходящий инструмент.
Kafka проще всего понимать как общий лог событий: приложения записывают события туда, а другие приложения читают их позже — часто в реальном времени, иногда через часы или дни.
Продюсеры — это записывающие стороны. Продюсер может публиковать событие вроде «order placed», «payment confirmed» или «temperature reading». Продюсеры не отправляют события напрямую конкретным приложениям — они отправляют их в Kafka.
Потребители — это читающие стороны. Потребитель может обновлять дашборд, запускать рабочий процесс отгрузки или загружать данные в аналитику. Потребители решают, что делать с событиями, и могут читать в своём темпе.
События в Kafka группируются в топики, которые по сути являются именованными категориями. Например:
orders для событий, связанных с заказамиpayments для платежных событийinventory для изменений запасовТопик становится «источником правды» для этого типа событий, что облегчает повторное использование данных несколькими командами без создания одноразовых интеграций.
Брокер — это сервер Kafka, который хранит события и отдаёт их потребителям. Практически Kafka работает как кластер (несколько брокеров вместе), чтобы справляться с большим трафиком и оставаться работоспособным при падении машины.
Потребители часто работают в группе потребителей. Kafka распределяет чтение между участниками группы, так что вы можете добавить больше экземпляров потребителя для масштабирования обработки — без того, чтобы каждый экземпляр выполнял ту же работу.
Kafka масштабируется, разделяя работу на топики (потоки связанных событий) и затем разбивая каждый топик на партиции (меньшие независимые куски этого потока).
Топик с одной партицией может быть прочитан только одним потребителем одновременно в рамках группы потребителей. Добавьте партиций — и вы сможете добавить больше потребителей для параллельной обработки событий. Так Kafka поддерживает высокообъёмную потоковую передачу событий и конвейеры данных в реальном времени, не превращая каждую систему в узкое место.
Партиции также помогают распределять нагрузку по брокерам. Вместо одной машины, которая обрабатывает все записи и чтения для топика, несколько брокеров могут размещать разные партиции и делить трафик.
Kafka гарантирует упорядоченность в пределах одной партиции. Если события A, B и C записаны в ту же партицию в таком порядке, потребители прочитают их A → B → C.
Упорядоченность между разными партициями не гарантируется. Если вам нужен строгий порядок для конкретной сущности (например, клиента или заказа), обычно всё событие для этой сущности направляют в одну партицию.
Когда продюсер отправляет событие, он может включить ключ (например, order_id). Kafka использует ключ, чтобы последовательно маршрутизировать связанные события в одну и ту же партицию. Это даёт предсказуемое упорядочивание по ключу, при этом общий топик масштабируется по многим партициям.
Каждая партиция может быть реплицирована на другие брокеры. Если один брокер выходит из строя, другой с репликой может взять на себя. Репликация — одна из причин, по которой Kafka доверяют для критичных систем: она повышает доступность и поддерживает отказоустойчивость без необходимости реализовывать собственную логику фейловера в каждом приложении.
Ключевая идея в Apache Kafka — события не просто передаются и забываются. Они записываются на диск в упорядоченный лог, поэтому потребители могут читать их сейчас или позже. Это делает Kafka полезной не только для перемещения данных, но и для хранения долговечной истории происходящего.
Когда продюсер отправляет событие в топик, Kafka дописывает его в хранилище на брокере. Потребители затем читают из этого хранимого лога в своём темпе. Если потребитель не работал в течение часа, события всё ещё существуют, и он сможет наверстать после восстановления.
Kafka хранит события в соответствии с политиками ретенции:
Ретенция конфигурируется на уровне топика, что позволяет по-разному относиться к «аудиторским» топикам и к высокообъёмной телеметрии.
Некоторые топики больше похожи на журнал изменений, чем на исторический архив — например, «текущие настройки клиента». Логовая компактция сохраняет по крайней мере последнее событие для каждого ключа, при этом старые устаревшие записи могут удаляться. Вы по-прежнему получаете долговой источник истины для актуального состояния без неограниченного роста данных.
Поскольку события остаются в хранилище, вы можете повторно проигрывать их, чтобы восстановить состояние:
На практике воспроизведение контролируется откуда потребитель «начинает читать» (его оффсетом), что даёт командам мощную подстраховку при эволюции систем.
Kafka создана так, чтобы данные продолжали течь даже при сбоях частей системы. Она делает это с помощью репликации, чётких правил о том, кто «владеет» партицией, и настраиваемых подтверждений записи.
У каждой партиции топика есть один лидер и один или несколько фолловеров-реплик на других брокерах. Продюсеры и потребители общаются с лидером этой партиции.
Фолловеры непрерывно копируют данные лидера. Если лидер падает, Kafka может поднять актуального фолловера до роли лидера, чтобы партиция оставалась доступной.
Если брокер падает, партиции, для которых он был лидером, становятся недоступны на короткое время. Контроллер Kafka обнаруживает проблему и запускает выбор лидера для этих партиций.
Если хотя бы одна фолловер-реплика достаточно синхронизирована, она может стать новым лидером и клиенты продолжат производить/потреблять. Если ни одна из реплик не в синхронизации, Kafka может приостановить записи (в зависимости от настроек), чтобы избежать потери подтверждённых данных.
Два основных параметра, влияющих на долговечность:
В общих чертах:
Чтобы уменьшить дубли при повторных попытках, команды часто совмещают надёжные acks с идемпотентными продюсерами и корректной обработкой потребителей.
Бóльшая безопасность обычно означает ждать больше подтверждений и держать больше реплик синхронизированными, что может добавить задержку и снизить пиковую пропускную способность.
Ниже задержка подходит для телеметрии или кликового потока, где допустима потеря; но для платежей, запасов и аудита обычно оправдана большая безопасность.
Событийно-ориентированная архитектура (EDA) — это способ построения систем, где события бизнеса (заказ создан, оплата подтверждена, посылка отправлена) представлены как события, на которые другие части системы могут реагировать.
Kafka часто находится в центре EDA как общий «поток событий». Вместо того, чтобы Сервис A вызывал Сервис B напрямую, Сервис A публикует событие (например, OrderCreated) в топик Kafka. Любое число других сервисов может потреблять это событие и реагировать — отправить письмо, зарезервировать запас, запустить проверку на мошенничество — без того чтобы Сервис A знал о них.
Поскольку сервисы общаются через события, им не нужно согласовывать request/response API для каждой интеракции. Это уменьшает жёсткие зависимости между командами и упрощает добавление новых возможностей: можно ввести нового потребителя для имеющегося события без изменения продюсера.
EDA по своей природе асинхронна: продюсеры записывают события быстро, а потребители обрабатывают их в своём темпе. При пиковых нагрузках Kafka помогает буферизовать всплеск, чтобы downstream-системы не рухнули сразу. Потребители могут масштабироваться, чтобы нагнать отставание, и если один потребитель временно упадёт, он может возобновить чтение с места остановки.
Думайте о Kafka как о «ленте активности» системы. Продюсеры публикуют факты; потребители подписываются на те факты, которые им нужны. Этот паттерн позволяет строить конвейеры данных в реальном времени и событийно-ориентированные рабочие процессы, при этом сервисы остаются проще и независимее.
Kafka обычно появляется там, где нужно перемещать много мелких «фактов, что произошло» между системами — быстро, надёжно и так, чтобы несколько потребителей могли повторно использовать данные.
Приложения часто нуждаются в append-only истории: входы пользователей, изменения прав, обновления записей или действия администраторов. Kafka хорошо подходит как центральный поток этих событий, чтобы инструменты безопасности, отчётности и экспорта соответствовали одному источнику. Поскольку события хранятся в течение времени, их можно воспроизвести, чтобы восстановить аудит после ошибки или изменения схемы.
Вместо прямых вызовов сервисы могут публиковать события вроде «order created» или «payment received». Другие сервисы подписываются и реагируют в своё время. Это уменьшает жёсткую связанность, помогает системам продолжать работу при частичных отказах и упрощает добавление новых возможностей (например, проверки на мошенничество) просто через потребление существующего потока.
Kafka часто служит основой для переноса данных из операционных систем в аналитические платформы. Команды могут стримить изменения из баз данных и доставлять их в хранилище или data lake с низкой задержкой, сохраняя отделение продакшн-приложения от тяжёлых аналитических запросов.
Датчики, устройства и телеметрия приложений часто приходят всплесками. Kafka способна поглотить импульсы, буферизовать их безопасно и позволить последующей обработке нагнать отставание — полезно для мониторинга, алёртинга и долгосрочного анализа.
Kafka — это не только брокеры и топики. Большинство команд полагаются на сопутствующие инструменты, которые делают Kafka практичной для ежедневного перемещения данных, обработки потоков и эксплуатации.
Kafka Connect — это фреймворк интеграции Kafka для получения данных в Kafka (sources) и вывода из Kafka (sinks). Вместо поддержки одноразовых конвейеров вы запускаете Connect и настраиваете коннекторы.
Типичные примеры: чтение изменений из баз данных, приём событий SaaS или доставка данных из Kafka в хранилище/объектное хранилище. Connect также стандартизирует эксплуатационные аспекты: повторные попытки, оффсеты и параллелизм.
Если Connect отвечает за интеграцию, то Kafka Streams отвечает за вычисления. Это библиотека, которую вы добавляете в приложение для трансформации потоков в реальном времени — фильтрация событий, обогащение, объединение потоков и построение агрегатов (например, «заказов в минуту»).
Поскольку Streams-приложения читают из топиков и записывают обратно в топики, они естественно вписываются в EDA и масштабируются добавлением экземпляров.
По мере того как несколько команд публикуют события, важна согласованность. Управление схемой (часто через schema registry) определяет, какие поля должно иметь событие и как они могут эволюционировать. Это помогает избежать поломок, например когда продюсер переименовал поле, от которого зависит потребитель.
Kafka чувствительна к эксплуатации, поэтому базовый мониторинг обязателен:
Большинство команд также используют UI для управления и автоматизацию для развёртываний, конфигурации топиков и политик доступа (см. /blog/kafka-security-governance).
Kafka часто сводят к «долговечный лог + потребители», но что важнее для команд: «обработаю ли я каждое событие ровно один раз, и что происходит при сбое?» Kafka даёт строительные блоки, а вы выбираете компромиссы.
At-most-once — вы можете потерять события, но не обработаете дубликаты. Такое поведение возникает, если потребитель закоммитил позицию раньше, чем завершил работу, и затем упал.
At-least-once — вы не потеряете события, но возможны дубликаты (например, потребитель обработал событие, упал и затем обработал его снова). Это наиболее распространённый режим по умолчанию.
Exactly-once стремится избежать и потерь, и дубликатов сквозь всю систему. В Kafka это обычно достигается через транзакционные продюсеры и совместимую обработку (часто через Kafka Streams). Это мощно, но требует аккуратной настройки и ограничений.
На практике многие системы принимают at-least-once и добавляют меры защиты:
Оффсет — это позиция последней обработанной записи в партиции. При коммите оффсета вы говорите: «я завершил до этого места». Коммит слишком ранний → риск потери; слишком поздний → больше дублей после восстановления.
Повторы должны быть ограничены и видимы. Распространённый паттерн:
Это не даёт одному сообщению блокировать всю группу потребителей, сохраняя при этом данные для последующего исправления.
Kafka часто переносит бизнес-критичные события (заказы, платежи, активность пользователей). Поэтому безопасность и управление данными — часть дизайна, а не последума.
Аутентификация отвечает на «кто вы?», авторизация — на «что вам разрешено?». В Kafka аутентификация обычно делается через SASL (например, SCRAM или Kerberos), а авторизация — через ACL (списки контроля доступа) на уровне топиков, групп потребителей и кластера.
Практика — принцип наименьших привилегий: продюсеры пишут только в свои топики, потребители читают только нужные топики. Это снижает риск случайного доступа и уменьшает радиус возможного ущерба при компрометации учётных данных.
TLS шифрует данные при передаче между приложениями, брокерами и инструментами. Без TLS события можно перехватить в внутренних сетях, не только в публичном интернете. TLS также помогает предотвращать атаки «man-in-the-middle», проверяя идентичность брокера.
Когда несколько команд делят кластер, нужны защитные механизмы. Чётные соглашения по именованию топиков (например, <team>.<domain>.<event>.<version>) делают ownership очевидным и помогают автоматизации применять политики последовательно.
Сопровождайте соглашения квотами и шаблонами ACL, чтобы один шумный рабочий процесс не задушил остальных, и чтобы новые сервисы стартовали с безопасными настройками по умолчанию.
Рассматривайте Kafka как систему учёта истории событий только тогда, когда это намеренно. Если события содержат PII, применяйте минимизацию данных (отправляйте идентификаторы вместо полных профилей), рассматривайте полевое шифрование и документируйте, какие топики чувствительны.
Настройки ретенции должны соответствовать юридическим и бизнес-требованиям. Если политика говорит «удалять через 30 дней», не храните 6 месяцев «на всякий случай». Регулярные ревью и аудиты помогают поддерживать конфигурации в актуальном соответствии с требованиями.
Запуск Apache Kafka — это не «установил и забыл». Она ведёт себя скорее как общая служба: многие команды зависят от неё, и небольшие ошибки могут распространиться на downstream-приложения.
Ёмкость Kafka — в основном задача расчёта, которую нужно пересматривать регулярно. Главные рычаги: партиции (параллелизм), пропускная способность (MB/s вход/выход) и рост хранилища (как долго вы храните данные).
Если трафик удваивается, может понадобиться больше партиций для распределения нагрузки по брокерам, больше диска для удержания ретенции и больше сетевого ресурса для репликации. Практическая привычка — прогнозировать пиковую скорость записи и умножать её на ретенцию, чтобы оценить рост диска, затем добавлять запас для репликации и «неожиданного успеха».
Ожидайте рутинной работы помимо поддержания серверов в рабочем состоянии:
Затраты определяются дисками, исходящим трафиком сети и количеством/размером брокеров. Управляемые Kafka-сервисы могут снизить нагрузку на команду и упростить обновления, тогда как собственное хостирование может быть дешевле в масштабе, если у вас есть опытные операторы. Компромисс — время восстановления и нагрузка на on-call команду.
Команды обычно мониторят:
Хорошие дашборды и алёрты превращают Kafka из «чёрного ящика» в понятный сервис.
Kafka отлично подходит, когда нужно надёжно перемещать много событий, хранить их некоторое время и позволять множеству систем реагировать на одни и те же данные в своём темпе. Особенно полезна, когда требуется воспроизводимость данных (для бэктрека, аудитов или восстановления сервиса) и когда ожидается рост числа продюсеров/потребителей со временем.
Kafka проявляет себя при:
Kafka может быть избыточной, если ваши потребности просты:
В этих случаях операционные издержки (подбор размера кластера, обновления, мониторинг, on-call) могут перевесить преимущества.
Kafka также дополняет, но не заменяет: БД (system of record), кеши (быстрое чтение) и batch ETL (большие периодические преобразования).
Спросите себя:
Если на большинство вопросов ответ «да», Kafka обычно — разумный выбор.
Kafka лучше всего подходит, когда вам нужен общий «источник правды» для потоков событий в реальном времени: много систем публикуют факты (создан заказ, авторизована оплата, изменился запас), и много систем потребляют эти факты для конвейеров, аналитики и реактивных фич.
Начните с узкого, ценного потока — например, публикация событий «OrderPlaced» для downstream-сервисов (email, антифрод, исполнение). Не превращайте Kafka в универсальную очередь с первого дня.
Запишите:
Держите ранние схемы простыми и последовательными (временные метки, ID и понятное имя события). Решите заранее — будете ли вы строго применять схемы или эволюционировать аккуратно.
Kafka успешна, когда кто-то отвечает за:
Добавьте мониторинг сразу (consumer lag, здоровье брокеров, пропускная способность, ошибки). Если у вас ещё нет платформенной команды, начните с управляемого предложения и чётких лимитов.
Произведите события из одной системы, потребьте их в одном месте и докажите замкнутый цикл end-to-end. Только потом расширяйте число потребителей, партиций и интеграций.
Если нужно быстро перейти от идеи к работающему событийно-ориентированному сервису, инструменты вроде Koder.ai помогают прототипировать сопутствующее приложение (React UI, Go backend, PostgreSQL) и итеративно добавлять продюсеров/потребителей Kafka через диалоговый рабочий процесс. Это удобно для создания внутренних дашбордов и лёгких сервисов-потребителей топиков, с возможностями планирования, экспорта кода, развёртывания и снимков со скатом назад.
Если вы проектируете EDA, посмотрите /blog/event-driven-architecture. Для оценки стоимости и окружений — /pricing.
Kafka — это распределённая платформа для потоковой передачи событий, которая хранит события в долговечных логах с добавлением в конец.
Производители (producers) записывают события в топики, а потребители (consumers) читают их независимо (часто в реальном времени, но также позже), потому что Kafka хранит данные в течение настроенного периода.
Используйте Kafka, когда несколько систем нуждаются в одном и том же потоке событий, вы хотите слабую связанность между сервисами и возможность воспроизведения истории.
Это особенно полезно для:
Топик — это именованная категория событий (например, orders или payments).
Партиция — это фрагмент топика, который обеспечивает:
Kafka гарантирует упорядоченность только внутри одной партиции.
Kafka использует ключ записи (например, order_id), чтобы последовательно направлять связанные события в одну и ту же партицию.
Практическое правило: если нужен порядок по сущности (все события по заказу/клиенту в последовательности), выбирайте ключ, представляющий эту сущность, чтобы события попадали в одну партицию.
Группа потребителей — это набор экземпляров потребителя, которые разделяют работу по топику.
Внутри группы:
Если два разных приложения должны получать каждое событие целиком, у них должны быть разные группы потребителей.
Kafka хранит события на диске по политикам ретенции, чтобы потребители могли нагнать отставание или переобработать историю.
Типичные политики ретенции:
Ретенция настраивается для каждого топика, поэтому важные аудиторские потоки можно хранить дольше, чем высокообъёмную телеметрию.
Логовая компактция сохраняет как минимум последнее значение для каждого ключа, удаляя со временем устаревшие записи.
Это полезно для потоков «текущее состояние» (настройки, профили), где важен последний записанный ключ, а не каждое изменение — при этом остаётся долговой источник истины для актуальных значений.
Наиболее распространённый шаблон в Kafka — это at-least-once: вы не потеряете события, но возможны дубли.
Для безопасной обработки:
Оффсет — это «закладка» потребителя для партиции.
Если коммитить оффсет слишком рано, можно потерять работу при падении; если слишком поздно — увеличатся дубли при восстановлении.
Оперативный паттерн: ограниченные попытки с бэкoff, затем отправка неудачных записей в dead-letter топик, чтобы одно «ядовитое» сообщение не блокировало всю группу.
Kafka Connect перемещает данные в Kafka и из Kafka через коннекторы (sources и sinks) без написания кастомного кода конвейера.
Kafka Streams — библиотека для реального времени внутри приложения: фильтрация, обогащение, объединения и агрегаты. Streams читает из топиков и записывает в топики, хорошо масштабируется добавлением экземпляров.
Connect обычно используют для интеграции; Streams — для вычислений и трансформаций.