82 lines
5.0 KiB
Markdown
82 lines
5.0 KiB
Markdown
# Кейс: 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-кейс, не приписанный к опыту в компаниях. Упоминается в резюме только в навыках как самостоятельно проработанная технология, без привязки к конкретному рабочему проекту.
|