Как в Apache Kafka организовано хранение и логирование сообщений?

«Как в Apache Kafka организовано хранение и логирование сообщений?» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в Apache Kafka сообщения логируются и хранятся. Это его фундаментальный принцип работы.

1. Основная концепция: Commit Log Kafka представляет собой распределенный, отказоустойчивый commit log. Все публикуемые сообщения записываются в конец лога (append-only) и сохраняются на диск.

2. Структура хранения:

  • Топик (Topic): Логическая категория или поток сообщений.
  • Партиция (Partition): Топик делится на партиции — упорядоченные, неизменяемые последовательности записей.
  • Смещение (Offset): Уникальный, последовательно возрастающий идентификатор сообщения внутри партиции.

3. Практический пример:

# Сообщение публикуется в топик `user-actions`
echo '{"userId": 123, "action": "login"}' | kafka-console-producer 
  --topic user-actions 
  --bootstrap-server localhost:9092

# Сообщение записывается в одну из партиций топика и получает offset.

4. Ключевые настройки хранения:

  • log.retention.hours: Время хранения сообщений (по умолчанию 168 часов / 7 дней).
  • log.retention.bytes: Максимальный общий размер лога на партицию перед удалением старых сегментов.

Таким образом, Kafka не просто передает сообщения, а надежно сохраняет их, позволяя потребителям читать данные в любом темпе и с любого смещения (offset).