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

Справочник по 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

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

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

ПараметрСмысл
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
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 (rebalance)
session.timeout.msПадение consumer → 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.


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 для эволюции контрактов событий.


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

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

Типичные 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Отдельный топик ошибок, retry с backoff

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

В подборках

Статья входит в тематические маршруты из меню Подборки и блока «С чего начать?» на главной. Соседние шаги того же маршрута:

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


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).