docs: Kafka pipeline v0.1.68 — полная документация, race condition fix, тесты

This commit is contained in:
Naeel
2026-04-06 17:42:44 +03:00
parent 07ada8e362
commit 815b861417
2 changed files with 176 additions and 25 deletions
+37 -25
View File
@@ -1,44 +1,56 @@
# Прогресс разработки
Последнее обновление: 2026-04-06
Последнее обновление: 2026-04-06 17:30 МСК
---
## 2026-04-06 — Kafka интеграция (ветка iot-kafka, в процессе)
## 2026-04-06 — Kafka pipeline ЗАВЕРШЁН (v0.1.68, ветка iot-kafka)
### Цель
Заменить прямой INSERT в Postgres из bridge на Kafka pipeline:
### Итог
End-to-end IoT pipeline работает:
```
MQTT → bridge → Kafka → iot-kafka-consumer → Postgres
→ event-dispatcher → Functions (будущее)
MQTT Device → EMQX → iot-mqtt-bridge → Kafka → iot-kafka-consumer → IoT Postgres → GET /iot/telemetry
```
### Обоснование
- RabbitMQ для IoT был подключён в bridge но бесполезен — никто не читал очередь
- Kafka даёт буферизацию, retention 7 дней, множество потребителей
- При переходе на managed Kafka в prod — только меняется KAFKA_BROKERS в Secret
### Что было сделано
- ✅ Kafka `apache/kafka:3.7.0` StatefulSet в KRaft mode (`deployments/k8s/kafka.yaml`)
- ✅ bridge переписан: убран RabbitMQ, добавлен Kafka producer
- ✅ `iot/cmd/kafka-consumer/main.go` — новый сервис, читает Kafka → пишет Postgres
- ✅ Dockerfile: 3 бинаря в одном образе (`manager`, `iot-mqtt-bridge`, `iot-kafka-consumer`)
- ✅ Race condition устранён: `ensureKafkaTopic()` создаёт топик до JOIN consumer group
- ✅ Тестирование: 5 рестартов consumer, рестарт Kafka, 10 сообщений параллельно
- ✅ Коммит `07ada8e`, образ `v0.1.68` в registry
### План
1. ✅ Документация + план
2. ✅ Ветка `iot-kafka`
3. ⏳ Helm: установить Kafka (bitnami, KRaft, 1 нод, PVC) в namespace `sless`
4. ⏳ bridge: убрать RabbitMQ, добавить Kafka producer (`segmentio/kafka-go`)
5. ⏳ Новый сервис `iot/cmd/kafka-consumer/main.go`
6. ⏳ Dockerfile + deployment манифесты
7. ⏳ Сборка v0.1.67, деплой, тест E2E
### Нерешённое
- ⚠️ Полный холодный старт (`kubectl apply -f` на чистый кластер) — НЕ ТЕСТИРОВАЛСЯ
- ⚠️ `rabbitmq` deployment в кластере — не используется IoT, можно убрать
- ⚠️ Helm chart — пока нет, нужен при переходе на managed Kafka/Postgres
### Что НЕ меняется
- EMQX, operator, REST API, IoT Console
- `iotpg` storage package
- ACL, auth, namespace-изоляция
### Версии
- Образ: `sless-operator:v0.1.68`
- Ветка: `iot-kafka` (коммит `07ada8e`)
- Kafka: `apache/kafka:3.7.0` (KRaft, 1 нод, PVC 1Gi на `vcd-disk-ext4`)
### Ключевые уроки
1. **`kubectl delete pod --force` ломает PVC** у stateful pod-ов — оставляет `.lock` файл. Только graceful delete.
2. **postStart lifecycle hook** не подходит для "подождать пока сервис стартует" — нет `nc`, `kafka-topics.sh` зависает, exit code 1 убивает контейнер.
3. **Race condition kafka-go** при одновременном auto-create топика и join группы — решается предсозданием топика через admin API в consumer ДО создания Reader.
4. **`// indirect` в go.mod** = gopls не видит пакет. Фикс: `go mod tidy`.
---
## 2026-04-06 (утро) — Kafka план + архитектурные решения
### Принятые архитектурные решения
- 3 кластера в prod: IoT / Serverless / Infra-Control
- Managed Kafka + Managed Postgres (переключение через env vars)
- Helm chart нужен для параметризации per-environment
- `apache/kafka:3.7.0` вместо Bitnami (платный с Aug 2025 — НИКОГДА не упоминать)
---
## 2026-04-05 (вечер) — v0.1.66: UX-правки + деструктивный инцидент
---
## 2026-04-05 (вечер) — v0.1.66: UX-правки + деструктивный инцидент
### Изменения кода