feat: split worker into separate binary (cmd/worker)

Kafka consumers and WorkerPool are moved out of the server process into
a dedicated worker binary. Server now handles HTTP + SSE only; worker
handles Kafka consumption and AI processing.

- cmd/worker/main.go + init.go: new binary with minimal config
  (DATABASE_URL, OPENAI_API_KEY, KAFKA_BROKERS)
- cmd/server: remove WorkerPool, paidConsumer, freeConsumer
- Dockerfile: builds both server and worker binaries
- docker-compose.yml: add worker service
- Makefile: add run-worker and docker-logs-worker targets
- README.md: document worker startup and env vars

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
dbastrikin
2026-03-18 20:09:33 +02:00
parent 0f533ccaeb
commit 48fd2baa8c
9 changed files with 186 additions and 28 deletions

View File

@@ -63,6 +63,43 @@ make migrate-up
make run
```
### 4. Запуск воркера
Сервер (`cmd/server`) и воркер (`cmd/worker`) — два отдельных процесса:
- **Сервер** — обслуживает HTTP API и SSE-стримы; публикует задания распознавания в Kafka.
- **Воркер** — потребляет задания из Kafka, вызывает AI, сохраняет результаты в БД и оповещает сервер через `pg_notify`.
**Локально** (инфраструктура в Docker, процессы локально):
```bash
# Поднять Kafka + PostgreSQL
docker compose up -d postgres kafka kafka-init
# В отдельном терминале — сервер
make run
# В другом терминале — воркер
go run ./cmd/worker
```
**Переменные окружения воркера:**
| Переменная | Описание |
|---|---|
| `DATABASE_URL` | DSN подключения к PostgreSQL |
| `OPENAI_API_KEY` | Ключ Gemini API (для распознавания блюд) |
| `KAFKA_BROKERS` | Адреса Kafka-брокеров (по умолчанию `kafka:9092`) |
**Через Docker Compose** (сервер + воркер + инфраструктура):
```bash
OPENAI_API_KEY=your-key docker compose up app worker
```
Воркеры можно масштабировать горизонтально — запустите несколько контейнеров `worker`,
они разделят нагрузку через consumer group `dish-recognition-workers`.
## Команды
### Сервер и тесты