Справочник по 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 в клиенте).
Справочные таблицы
Содержание справочника
- Компоненты кластера
- Команды CLI (kafka-*.sh)
- Параметры топика
- Producer — ключевые настройки
- Consumer — ключевые настройки
- Broker (server.properties)
- Consumer groups и rebalancing
- Гарантии доставки
- Клиентские библиотеки
- Наблюдаемость
- Типичные anti-patterns
Компоненты кластера
| Компонент | Роль |
|---|---|
| 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 g1 | Lag по партициям |
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.policy | delete или compact (log compaction по key) |
min.insync.replicas | Минимум ISR для acks=all |
max.message.bytes | Макс. размер записи |
compression.type | producer, gzip, lz4, zstd, snappy |
Партиция выбирается: hash(key) % num_partitions при заданном key; иначе sticky / round-robin.
Producer — ключевые настройки
| Свойство | Значения | Смысл |
|---|---|---|
bootstrap.servers | host:9092,... | Адреса брокеров |
key.serializer / value.serializer | класс | Сериализация |
acks | 0, 1, all | Подтверждение: none / leader / все ISR |
retries | число | Повторы при transient error |
enable.idempotence | true | Идемпотентный producer (без дублей при retry) |
max.in.flight.requests.per.connection | 1–5 | Параллельные запросы (с idempotence ≤5) |
compression.type | lz4, zstd, … | Сжатие на брокере |
batch.size / linger.ms | Батчинг для throughput | |
transactional.id | строка | Транзакции produce (exactly-once в связке с consumer) |
Consumer — ключевые настройки
| Свойство | Значения | Смысл |
|---|---|---|
group.id | строка | Consumer group (обязательно) |
auto.offset.reset | earliest, latest, none | Если offset неизвестен |
enable.auto.commit | true / 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.level | read_uncommitted / read_committed | Видимость транзакционных записей |
partition.assignment.strategy | Range, CooperativeSticky, … | Стратегия назначения партиций |
Ручной commit: commitSync() / commitAsync() после обработки batch.
Broker (server.properties)
| Ключ | Смысл |
|---|---|
broker.id | Уникальный ID узла |
listeners / advertised.listeners | Слушать / адрес для клиентов |
log.dirs | Каталоги данных |
num.partitions | Default для новых топиков |
default.replication.factor | Default RF |
offsets.topic.replication.factor | RF для __consumer_offsets |
transaction.state.log.replication.factor | RF для транзакций |
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 membership | group.instance.id — меньше «шторма» rebalance |
Lag — разница между последним offset в партиции и committed offset группы (kafka-consumer-groups.sh --describe).
Гарантии доставки
| Уровень | Как достичь |
|---|---|
| At-most-once | acks=0, auto-commit до обработки |
| At-least-once | acks=all, commit после обработки, идемпотентный consumer |
| Exactly-once | Транзакционный producer + read_committed + идемпотентная обработка / Kafka Streams |
Порядок записей гарантирован внутри одной партиции, не между партициями.
Клиентские библиотеки
| Язык | Библиотека |
|---|---|
| Java | org.apache.kafka:kafka-clients |
| Python | confluent-kafka, kafka-python |
| C# | Confluent.Kafka |
| Node.js | kafkajs |
| Go | segmentio/kafka-go, confluent-kafka-go |
| Rust | rdkafka |
Schema Registry (Confluent): Avro/Protobuf/JSON Schema для эволюции контрактов событий.
Наблюдаемость
| Инструмент | Метрики / задачи |
|---|---|
| JMX | Throughput, request latency, ISR shrink |
| Prometheus + kafka_exporter | Lag, bytes in/out |
| UI: AKHQ, Kafka UI, Confluent Control Center | Топики, группы, сообщения |
kafka-consumer-groups.sh | Lag в 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.
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Масштабирование — это сам процесс увеличения мощности системы, чтобы она выдерживала эту нагрузку. Для реализации используется фреймворк FastAPI, который обеспечивает высокую производительность и автоматическую генерацию документации API. Язык программирования Go (Golang) представляет собой мощный инструмент для создания высоконагруженных распределенных систем. Балансировка нагрузки - распределение трафика между узлами для масштабирования, отказоустойчивости и сглаживания пиков. Распределённая система — это совокупность независимых компонентов (серверов, узлов, микросервисов), которые взаимодействуют друг с другом через сеть для выполнения общей задачи. Интеграция микросервисов — это процесс объединения независимых сервисов в единую систему, чтобы они могли эффективно взаимодействовать и решать общие задачи. Мы уже изучали асинхронность, поэтому можем уже понять, что асинхронная коммуникация — это способ взаимодействия, при котором отправитель не ждёт немедленного ответа от получателя. Синхронная коммуникация — это способ взаимодействия, при котором отправитель отправляет запрос и ждёт ответа от получателя. REST — это просто набор правил, как писать HTTP-запросы так, чтобы тебя понимали другие программисты. Это не технология, не протокол, не библиотека. Это как правила этикета для API. Заголовок Sec-WebSocket-Key используется для предотвращения кэширования и проверки подлинности. Брокер сообщений — это программное обеспечение или система, которая управляет обменом данными между приложениями, сервисами или системами. RabbitMQ - очереди сообщений, модель производитель–потребитель и типовые сценарии интеграции микросервисов.Масштабирование микросервисных систем
Первые шаги к микросервисам
Go для микросервисов
Балансировка нагрузки
Архитектура микросервисов (MSA) и распределённые системы
Коммуникация и интеграция
Асинхронная коммуникация
Синхронная коммуникация
REST
Реактивная коммуникация
Брокеры сообщений
RabbitMQ