Initial commit: interview prep repo (resume, legend, stack cases, Kubernetes course)
This commit is contained in:
81
stack/kafka/CASE.md
Normal file
81
stack/kafka/CASE.md
Normal file
@@ -0,0 +1,81 @@
|
||||
# Кейс: Kafka (домашняя однонодовая лаба)
|
||||
|
||||
Связь с легендой: [../../legend/LEGEND.md](../../legend/LEGEND.md) — раздел «Домашняя лаборатория / pet-проект». Kafka упоминалась только в требованиях вакансии Альфа-Банка и в вопросах Bi.Zone — в рабочем стеке компаний из резюме её нет, честный pet-кейс.
|
||||
|
||||
## Что нужно реально сделать (домашний стенд)
|
||||
|
||||
Однонодовый Kafka-брокер в режиме KRaft (без ZooKeeper — так проще для домашней лабы и это актуальная архитектура в новых версиях) в Docker, создать топик, погонять продюсера/консюмера через встроенные CLI-утилиты и замерить пропускную способность через `kafka-producer-perf-test`.
|
||||
|
||||
### 1. docker-compose.yml
|
||||
|
||||
```yaml
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
kafka:
|
||||
image: apache/kafka:3.7.0
|
||||
container_name: kafka-lab
|
||||
ports:
|
||||
- "9092:9092"
|
||||
environment:
|
||||
KAFKA_NODE_ID: 1
|
||||
KAFKA_PROCESS_ROLES: broker,controller
|
||||
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
|
||||
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
|
||||
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
|
||||
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-lab:9093
|
||||
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
|
||||
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
|
||||
```
|
||||
|
||||
### 2. Создать топик и погонять продюсера/консюмера
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
|
||||
docker exec -it kafka-lab /opt/kafka/bin/kafka-topics.sh \
|
||||
--create --topic orders-events --bootstrap-server localhost:9092 \
|
||||
--partitions 3 --replication-factor 1
|
||||
|
||||
# консюмер в одном терминале
|
||||
docker exec -it kafka-lab /opt/kafka/bin/kafka-console-consumer.sh \
|
||||
--topic orders-events --bootstrap-server localhost:9092 --group demo-group
|
||||
|
||||
# продюсер в другом терминале
|
||||
docker exec -it kafka-lab /opt/kafka/bin/kafka-console-producer.sh \
|
||||
--topic orders-events --bootstrap-server localhost:9092
|
||||
```
|
||||
|
||||
Набрать несколько сообщений в продюсере — увидеть их в консюмере в реальном времени. Открыть второй консюмер с той же `--group demo-group` — увидеть, как партиции топика (3 штуки) распределяются между консюмерами внутри одной consumer group (каждое сообщение читается только одним консюмером из группы — это и есть горизонтальное масштабирование обработки).
|
||||
|
||||
### 3. Партиции и оффсеты
|
||||
|
||||
```bash
|
||||
docker exec -it kafka-lab /opt/kafka/bin/kafka-topics.sh \
|
||||
--describe --topic orders-events --bootstrap-server localhost:9092
|
||||
|
||||
docker exec -it kafka-lab /opt/kafka/bin/kafka-consumer-groups.sh \
|
||||
--describe --group demo-group --bootstrap-server localhost:9092
|
||||
```
|
||||
|
||||
Второй вывод показывает `CURRENT-OFFSET`/`LOG-END-OFFSET`/`LAG` на партицию — практическое понимание, как Kafka отслеживает, что консюмер уже прочитал, а что ещё нет.
|
||||
|
||||
### 4. Замер пропускной способности
|
||||
|
||||
```bash
|
||||
docker exec -it kafka-lab /opt/kafka/bin/kafka-producer-perf-test.sh \
|
||||
--topic orders-events --num-records 100000 --record-size 200 \
|
||||
--throughput -1 --producer-props bootstrap.servers=localhost:9092
|
||||
```
|
||||
|
||||
Записать полученные `records/sec` и `MB/sec` в [../../legend/CAPACITY.md](../../legend/CAPACITY.md) — честная лабная цифра для разговора про пропускную способность.
|
||||
|
||||
## Что это даёт в разговоре с интервьюером
|
||||
|
||||
- Понимание топика, партиции, consumer group, оффсета не как определений, а как наблюдаемого поведения (`--describe` показывает реальное распределение и лаг).
|
||||
- Понимание, зачем нужны партиции — параллельная обработка внутри одной consumer group.
|
||||
- Лабная цифра пропускной способности как честная база для разговора о производительности.
|
||||
|
||||
## Как это ложится в легенду
|
||||
|
||||
Kafka — pet-кейс, не приписанный к опыту в компаниях. Упоминается в резюме только в навыках как самостоятельно проработанная технология, без привязки к конкретному рабочему проекту.
|
||||
27
stack/kafka/QUESTIONS.md
Normal file
27
stack/kafka/QUESTIONS.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# Вопросы: Kafka
|
||||
|
||||
Опираются на кейс: [CASE.md](CASE.md). Источники — [Bi.Zone.md](../../interview/Bi.Zone.md), [Alfa-Bank.md](../../interview/Alfa-Bank.md) (упомянута в требованиях вакансии).
|
||||
|
||||
### Что такое Kafka?
|
||||
|
||||
Распределённая платформа для потоковой передачи событий (event streaming) — по сути, отказоустойчивый распределённый лог сообщений. Продюсеры пишут сообщения в топики, консюмеры читают их независимо друг от друга и в своём темпе; в отличие от классической очереди сообщения не удаляются сразу после прочтения, а хранятся заданное время (retention), поэтому несколько разных консюмеров могут читать один и тот же поток данных с разной скоростью или начинать читать заново.
|
||||
|
||||
### С какими версиями Kafka работал?
|
||||
|
||||
В домашней лабе поднимал актуальную версию (3.7) в режиме KRaft — то есть без ZooKeeper, это более новая архитектура, где консенсус по метаданным кластера реализован внутри самой Kafka через `controller`-роль вместо отдельного ZooKeeper-кластера. Более старые продовые инсталляции (до Kafka 3.x/4.x) чаще всего используют классическую схему с ZooKeeper — если на конкретном месте работы Kafka завязана на ZooKeeper, стоит явно уточнить это у интервьюера, чтобы не путать архитектуры.
|
||||
|
||||
### Что такое партиции и оффсеты?
|
||||
|
||||
Топик физически делится на партиции — это единица параллелизма и хранения. Каждое сообщение внутри партиции получает последовательный номер — оффсет, и порядок сообщений гарантирован только внутри одной партиции (не между партициями топика). Консюмер отслеживает, до какого оффсета он уже прочитал каждую партицию — это позволяет ему продолжить с того же места после перезапуска. У себя в лабе создавал топик с 3 партициями и через `kafka-consumer-groups.sh --describe` явно видел `CURRENT-OFFSET`/`LOG-END-OFFSET`/`LAG` по каждой партиции.
|
||||
|
||||
### Что такое consumer group и как балансируются партиции внутри неё?
|
||||
|
||||
Consumer group — логическое объединение нескольких консюмеров, которые вместе обрабатывают топик так, что каждое сообщение читается только одним консюмером из группы (а не всеми) — это механизм горизонтального масштабирования обработки. Партиции топика распределяются между консюмерами группы; если консюмеров больше, чем партиций, часть консюмеров останется без партиций и будет простаивать. У себя в лабе с топиком на 3 партиции и двумя консюмерами в одной группе увидел, как каждый консюмер забрал себе часть партиций.
|
||||
|
||||
### Что такое AT/ET CI/CD в контексте Kafka? (формулировка с собеседования Bi.Zone)
|
||||
|
||||
В контексте связки Kafka с CI/CD-пайплайнами это, по всей видимости, отсылка к семантике доставки сообщений — **at-least-once** (сообщение гарантированно доставлено, но может задублироваться при retry) и **exactly-once** (доставка ровно один раз, более строгая и дорогая гарантия, у Kafka реализуется через идемпотентного продюсера и транзакции). В пайплайнах обработки данных выбор между этими семантиками определяет, нужна ли дедупликация на стороне консюмера. Честно: на самом собеседовании формулировка вопроса была нестандартной, и это моя интерпретация вероятного смысла — по этой конкретной формулировке лучше переспросить интервьюера, что именно имеется в виду, а не гадать молча.
|
||||
|
||||
### Как замерить пропускную способность Kafka?
|
||||
|
||||
Встроенная утилита `kafka-producer-perf-test.sh` — задаёшь число записей, размер записи и лимит throughput (`-1` — без ограничения, максимальная скорость) и получаешь `records/sec`/`MB/sec` на конкретном железе. Я гонял такой замер у себя на однонодовом брокере — конкретные цифры и то, как они соотносятся с публично известными продовыми показателями, зафиксированы в [../../legend/CAPACITY.md](../../legend/CAPACITY.md).
|
||||
Reference in New Issue
Block a user