Перейти к основному содержимому

Справочник по Apache Kafka


Назначение

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


Краткое пояснение

Kafka хранит поток записей в топиках, разбитых на партиции (упорядоченный журнал). Producer append-ит записи; consumer в group читает с offset. Репликация и лидер партиции дают отказоустойчивость. Координация: KRaft (Kafka 3.3+) или ZooKeeper (legacy).


Быстрый старт

# KRaft single-node (Kafka 3.x+, без ZooKeeper)
docker run -d --name kafka -p 9092:9092 \
-e KAFKA_NODE_ID=1 \
-e KAFKA_PROCESS_ROLES=broker,controller \
-e KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9093 \
apache/kafka:latest

# топик + тест
docker exec kafka /opt/kafka/bin/kafka-topics.sh \
--bootstrap-server localhost:9092 --create --topic demo --partitions 3 --replication-factor 1

Разбор:

  • Утилиты bin/kafka-*.sh (или .bat на Windows) управляют топиками и тестовой публикацией из каталога установки Kafka.
  • docker run -d стартует контейнер в фоне; -p host:container пробрасывает порты AMQP и веб-UI на localhost.
  • Команды Kafka создают топик с числом партиций и фактором репликации; переменные KAFKA_* настраивают single-node KRaft в Docker.

Bootstrap: localhost:9092 (или bootstrap.servers в клиенте).


Справочные таблицы

Содержание справочника


Компоненты кластера

КомпонентРоль
BrokerХранит партиции, принимает produce/fetch
TopicИменованный поток записей
PartitionУпорядочный лог; единица параллелизма
ReplicaКопия партиции; один leader, остальные followers
ProducerПишет в топик (выбор партиции по key или round-robin)
ConsumerЧитает с offset
Consumer groupГруппа consumers; одна партиция — один consumer в группе
OffsetПозиция в партиции; хранится в __consumer_offsets
ControllerМетаданные, выбор лидеров (KRaft или ZK)

Команды CLI (kafka-*.sh)

Путь: $KAFKA_HOME/bin/ (в Docker — /opt/kafka/bin/).

КомандаПримерНазначение
kafka-topics.sh --create--topic T --partitions 6 --replication-factor 3Создать топик
kafka-topics.sh --list--bootstrap-server localhost:9092Список топиков
kafka-topics.sh --describe--topic TПартиции, ISR, leader
kafka-topics.sh --alter--partitions 12Увеличить число партиций
kafka-topics.sh --delete--topic TУдалить (если delete.topic.enable=true)
kafka-console-producer.sh--topic TИнтерактивная отправка
kafka-console-consumer.sh--topic T --from-beginning --group g1Чтение в консоль
kafka-consumer-groups.sh --listСписок групп
kafka-consumer-groups.sh --describe--group g1Lag по партициям
kafka-consumer-groups.sh --reset-offsets--to-earliest --executeСброс offset (осторожно)
kafka-configs.sh --alter--entity-type topics --entity-name TДинамический config топика
kafka-broker-api-versions.shСовместимость API
kafka-acls.sh --add--allow-principal User:x --operation Read --topic TACL
kafka-mirror-maker.shMM2 propertiesЗеркалирование между кластерами

Параметры топика

ПараметрСмысл
num.partitionsПартиций по умолчанию при auto-create
replication.factorЧисло реплик (≤ числа брокеров)
retention.msСколько хранить записи (время)
retention.bytesЛимит размера партиции
cleanup.policydelete или compact (log compaction по key)
min.insync.replicasМинимум ISR для acks=all
max.message.bytesМакс. размер записи
compression.typeproducer, gzip, lz4, zstd, snappy

Партиция выбирается: hash(key) % num_partitions при заданном key; иначе sticky / round-robin.


Producer — ключевые настройки

СвойствоЗначенияСмысл
bootstrap.servershost:9092,...Адреса брокеров
key.serializer / value.serializerклассСериализация
acks0, 1, allПодтверждение: none / leader / все ISR
retriesчислоПовторы при transient error
enable.idempotencetrueИдемпотентный producer (без дублей при retry)
max.in.flight.requests.per.connection15Параллельные запросы (с idempotence ≤5)
compression.typelz4, zstd, …Сжатие на брокере
batch.size / linger.msБатчинг для throughput
delivery.timeout.msОбщий дедлайн доставки (retry + ack)
transactional.idстрокаТранзакции produce (exactly-once в связке с consumer)

Consumer — ключевые настройки

СвойствоЗначенияСмысл
group.idстрокаConsumer group (обязательно)
auto.offset.resetearliest, latest, noneЕсли offset неизвестен
enable.auto.committrue / falseАвто-commit offset
auto.commit.interval.msИнтервал auto-commit
max.poll.recordsчислоЗаписей за один poll()
max.poll.interval.msТаймаут обработки batch; превышение → исключение из группы
fetch.min.bytesМинимум байт для ответа fetch (батчинг на broker)
fetch.max.wait.msМакс. ожидание набора fetch.min.bytes
fetch.max.bytesВерхняя граница размера fetch-ответа
max.partition.fetch.bytesЛимит байт на партицию в одном fetch
session.timeout.msПадение consumer → rebalance
group.instance.idStatic membership — меньше rebalance при рестарте
isolation.levelread_uncommitted / read_committedВидимость транзакционных записей
partition.assignment.strategyRange, CooperativeSticky, …Стратегия назначения партиций

Ручной commit: commitSync() / commitAsync() после обработки batch.


Broker (server.properties)

КлючСмысл
broker.idУникальный ID узла
listeners / advertised.listenersСлушать / адрес для клиентов
log.dirsКаталоги данных
num.partitionsDefault для новых топиков
default.replication.factorDefault RF
offsets.topic.replication.factorRF для __consumer_offsets
transaction.state.log.replication.factorRF для транзакций
log.retention.hours / log.retention.bytesХранение по умолчанию
min.insync.replicasМинимум синхронных реплик
delete.topic.enableРазрешить удаление топиков
auto.create.topics.enableАвтосоздание (в prod часто false)

KRaft: process.roles=broker,controller, controller.quorum.voters, node.id — вместо zookeeper.connect.

Security (prod): listeners=SASL_SSL://..., authorizer.class.name=kafka.security.authorizer.AclAuthorizer, super.users=User:admin.


Consumer groups и rebalancing

СобытиеПоведение
Новый consumer в группеRebalance: перераспределение партиций
Consumer не вызывает poll() дольше max.poll.interval.msИсключение из группы, rebalance
Число consumers > партицийЛишние consumers простаивают
Static membershipgroup.instance.id — меньше "шторма" rebalance

Lag — разница между последним offset в партиции и committed offset группы (kafka-consumer-groups.sh --describe).


Гарантии доставки

УровеньКак достичь
At-most-onceacks=0, auto-commit до обработки
At-least-onceacks=all, commit после обработки, идемпотентный consumer
Exactly-onceТранзакционный producer + read_committed + идемпотентная обработка / Kafka Streams

Порядок записей гарантирован внутри одной партиции, не между партициями.


Клиентские библиотеки

ЯзыкБиблиотека
Javaorg.apache.kafka:kafka-clients
Pythonconfluent-kafka, kafka-python
C#Confluent.Kafka
Node.jskafkajs
Gosegmentio/kafka-go, confluent-kafka-go
Rustrdkafka

Schema Registry (Confluent): Avro/Protobuf/JSON Schema для эволюции контрактов событий. Подробнее — Kafka, раздел Schema Registry.


Schema Registry и сериализаторы

КомпонентНазначение
SubjectИмя схемы, обычно <topic>-key / <topic>-value
Schema idЧисловой id версии в реестре; в начале каждого Avro-сообщения
BACKWARD / FORWARD / FULLПолитика совместимости при регистрации новой версии
KafkaAvroSerializerJava: регистрация схемы + сериализация
schema.registry.urlURL реестра в config producer/consumer
Apicurio / AWS GlueАльтернативные реестры

Wire format (Confluent): 0x00 + 4-byte schema id + Avro bytes.


Наблюдаемость

ИнструментМетрики / задачи
JMXThroughput, request latency, ISR shrink
Prometheus + kafka_exporterLag, bytes in/out
UI: AKHQ, Kafka UI, Confluent Control CenterТопики, группы, сообщения
kafka-consumer-groups.shLag в CLI

Метрики для алертов (prod):

МетрикаПорог / действие
UnderReplicatedPartitions> 0 дольше 5 мин → проверить брокер/диск/сеть
OfflinePartitionsCount> 0 → критично, запись недоступна
Consumer lag (max по группе)SLO команды (например, > 60 сек)
RequestHandlerAvgIdlePercentУстойчиво низкий → CPU bottleneck
Producer record-error-rate> 0 → retry, auth, quota
unclean.leader.election.rateДолжен быть 0 при unclean.leader.election.enable=false

Типичные anti-patterns

ПроблемаРешение
Один key на все сообщенияРаспределение по ключам (userId, orderId)
Слишком мало партицийМасштабирование consumers ограничено числом партиций
auto.commit до обработкиCommit после успешной бизнес-логики
Огромные сообщения (>1 MB)Chunking, object storage + ссылка в событии
Consumer group на каждый deploy без static idЛишние rebalance; cooperative assignor
Kafka как job queue без DLQОтдельный топик ошибок (*.dlq), retry с backoff
JSON без схемы в multi-team prodAvro + Schema Registry, CI-проверка совместимости

Сравнение с очередями: Справочник по RabbitMQ.


В подборках

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

СправочникиСправочник по RabbitMQ, Справочник по Docker, Справочник по GraphQL, Справочник по Kubernetes, Справочник по gRPC, Справочник по Roblox.