Как Kafka записывает сообщения и как их отдаёт

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

Ответ

Kafka — это распределённая система обмена сообщениями, построенная на принципе журнала с добавлением записей (append-only log).

Запись сообщений:

  1. Производитель (Producer) отправляет сообщение в определённый топик.
  2. Топик разделён на партиции для параллелизма. Сообщение записывается в одну партицию на основе ключа (хешируется) или по круговому алгоритму (round-robin), если ключ не указан.
  3. Сообщение добавляется в конец журнала партиции и получает уникальный, монотонно возрастающий offset.
  4. Сообщения сохраняются на диск и реплицируются между брокерами (настраивается фактором репликации). Гарантии доставки контролируются параметром acks (0, 1, all).

Чтение сообщений:

  1. Потребитель (Consumer) указывает, какую группу потребителей (consumer group) он представляет.
  2. Каждая партиция топика назначается только одному потребителю внутри группы, обеспечивая параллельное чтение и гарантию порядка в пределах одной партиции.
  3. Потребитель читает сообщения последовательно, отслеживая свою позицию (offset) для каждой партиции. Он может начать с начала, с конца или с конкретного offset.
  4. Сообщения не удаляются после чтения. Они хранятся в течение заданного времени или до достижения лимита размера (политики удержания — retention). Это позволяет «отстающим» потребителям или новым группам читать исторические данные.

Пример команды для консольного производителя и потребителя:

# Запись сообщения в топик 'test-topic'
echo "Hello, Kafka" | kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic

# Чтение сообщений с начала топика 'test-topic'
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning

Ключевые преимущества: высокая пропускная способность за счёт последовательной записи на диск, горизонтальная масштабируемость, отказоустойчивость за счёт репликации и поддержка потоковой обработки.