Найти в Дзене
Записки о Java

Apache Kafka и Java: как передавать сообщения надёжно, быстро и масштабируемо

Kafka — это не просто очередь. Это распределённая платформа потоковой передачи событий.
И если вы пишете на Java и работаете с микросервисами, логами, аналитикой или событийной архитектурой — вам обязательно нужно знать Kafka. Apache Kafka — это распределённый брокер сообщений с открытым исходным кодом, изначально разработанный в LinkedIn, а теперь активно используемый в Netflix, Uber, Twitter, Spotify и тысячах других компаний. Это промежуточная система, которая: Это реализует паттерн Producer-Consumer, а также Publish/Subscribe — когда один продюсер может отправлять данные множеству подписчиков. 💡 Почему не просто REST API?
Потому что Kafka: Децентрализована — работает на кластере серверов
Масштабируема — обрабатывает миллионы сообщений в секунду
Надёжна — данные дублируются и сохраняются даже при падении узлов
Постоянна — сообщения хранятся не мгновенно, а в течение времени или объёма
Kafka работает не на одном сервере, а на кластере брокеров (nodes).
Это даёт: Kafka использует мо
Оглавление
Рисунок: Apache Kafka
Рисунок: Apache Kafka

Введение

Kafka — это не просто очередь. Это распределённая платформа потоковой передачи событий.
И если вы пишете на Java и работаете с микросервисами, логами, аналитикой или событийной архитектурой — вам
обязательно нужно знать Kafka.

Что такое Apache Kafka?

Apache Kafka — это распределённый брокер сообщений с открытым исходным кодом, изначально разработанный в LinkedIn, а теперь активно используемый в Netflix, Uber, Twitter, Spotify и тысячах других компаний.

А что такое «брокер сообщений»?

Это промежуточная система, которая:

  • Принимает сообщения от продюсеров (источников)
  • Сохраняет их надёжно
  • Передаёт консьюмерам (получателям)

Это реализует паттерн Producer-Consumer, а также Publish/Subscribe — когда один продюсер может отправлять данные множеству подписчиков.

💡 Почему не просто REST API?
Потому что Kafka:
Децентрализована — работает на кластере серверов
Масштабируема — обрабатывает миллионы сообщений в секунду
Надёжна — данные дублируются и сохраняются даже при падении узлов
Постоянна — сообщения хранятся не мгновенно, а в течение времени или объёма

Что значит «распределённый»?

Kafka работает не на одном сервере, а на кластере брокеров (nodes).
Это даёт:

  • Отказоустойчивость: если один сервер упал — данные всё равно доступны
  • Горизонтальное масштабирование: добавили сервер — увеличили пропускную способность
  • Параллельную обработку: разные партиции можно читать одновременно

Как происходит передача данных в Kafka?

Kafka использует модель publish/subscribe:

  1. Продюсер (Producer) отправляет сообщение в топик (Topic)
  2. Топик — это логический канал, например: user-signups, payment-events, logs
  3. Консьюмер (Consumer) подписывается на топик и читает сообщения из него
Важно: Kafka не удаляет сообщения сразу после чтения!
Они хранятся в течение:
Времени: например, 7 дней (log.retention.hours=168)
Объёма: например, 1 ГБ на партицию (log.retention.bytes=1073741824)

Это позволяет:

  • Перечитывать данные
  • Добавлять новых консьюмеров «задним числом»
  • Строить потоковую аналитику

Топик, партиции и оффсеты — ключевые концепции

Топик (Topic)

Логический канал для сообщений. Пример: orders.

Партиции (Partitions)

Топик делится на партиции — это физические сегменты на диске.

Зачем нужны партиции? Параллелизм: один топик может читаться несколькими консьюмерами одновременно
Масштабируемость: чем больше партиций — тем выше пропускная способность
Упорядоченность: сообщения упорядочены только внутри одной партиции
Порядок между партициями не гарантируется!

Оффсет (Offset)

Это уникальный номер сообщения внутри партиции.

  • Консьюмер сохраняет последний прочитанный оффсет
  • При перезапуске он продолжает чтение с этого места
  • Оффсеты хранятся в специальном топике __consumer_offsets

Структура сообщения Kafka

Каждое сообщение (Record) состоит из:

key - Опциональный ключ (например,userId). Используется длямаршрутизации в партицию

value - Основные данные (например, JSON с событием)

timestamp - Время создания или получения сообщения

headers - Дополнительные метаданные в формате key-value (например,trace-id,version)

Если вы отправляете сообщения с одинаковым key, они всегда попадут в одну и ту же партицию → сохранится порядок!

Семантика доставки сообщений (Message Delivery Semantics)

Kafka поддерживает три режима доставки:

At-Most-Once - Сообщение может быть потеряно, но не дублируется

enable.auto.commit=true+ не делать ручной коммит

At-Least-Once - Сообщение гарантированно доставлено, но может дублироваться

enable.auto.commit=false+consumer.commitSync()после обработки

Exactly-Once - Сообщение доставлено ровно один раз

Использовать идемпотентного продюсера+транзакции

Как включить Exactly-Once в продюсере:

props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true); // идемпотентность

props.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "my-transactional-id");

⚠Exactly-Once требует Kafka >= 0.11 и транзакционной поддержки.

Объяснение словами пятилетнего ребенка.

Представь, что у тебя есть волшебная почта.Ты (продюсер) кладёшь письмо в ящик с надписью «Друзья» (это топик). Почтальон (Kafka) не отдаёт письмо сразу, а хранит его в сейфе — на случай, если друг заболел и не смог забрать сегодня. Когда друг (консьюмер) приходит — он говорит: «Я уже забирал письма до номера 5».
Почтальон даёт ему письмо №6, №7 и так далее. А если у тебя
много друзей — почтальон делит ящик «Друзья» на три полки (партиции), чтобы всем было удобно брать письма сразу! И самое крутое: если письмо упадёт — почтальон не потеряет его, а положит обратно! Вот так работает Kafka — умная, надёжная и быстрая почта для программ! 💌

Заключение

Apache Kafka — это не просто «очередь сообщений». Это платформа для потоковой обработки данных в реальном времени.

С Kafka вы можете:

  • Строить событийно-ориентированную архитектуру
  • Передавать логи между сервисами
  • Реализовывать CQRS, Event Sourcing
  • Собирать аналитику в реальном времени

А с Java — вы получаете мощные, производительные клиенты прямо из коробки.