Тестовое задание для проекта «Лабс» Wildberries
#Ссылка на видео https://drive.google.com/file/d/1HGzKGDjLh0K5iiDPtIZloaAjY4l1IpOw/view?usp=sharing
Демонстрационный сервис для управления заказами с использованием:
- PostgreSQL - хранение данных
- NATS Streaming - message broker
- In-Memory Cache - быстрый доступ к данным
- HTTP API - REST API для получения заказов
- Web UI - простой интерфейс для поиска заказов
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ Publisher │─────▶│ NATS Stream │─────▶│ Service │
└─────────────┘ └──────────────┘ └─────────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌─────────┐ ┌───────┐ ┌──────────┐
│ Cache │ │ DB │ │ HTTP API │
│(Memory) │ │ (PG) │ └──────────┘
└─────────┘ └───────┘
- Publisher публикует заказы в NATS Streaming
- Service подписывается на канал и получает сообщения
- Валидация данных перед обработкой
- Сохранение в PostgreSQL (транзакция)
- Сохранение в In-Memory Cache
- Подтверждение обработки (ACK)
- HTTP API отдаёт данные из кэша
- Go 1.21+
- Docker & Docker Compose
- Make (опционально)
git clone <your-repo-url>
cd wb-l0make docker-up
# Или без Make
docker-compose up -dmake migrate-up
# Или напрямую
PGPASSWORD=wbpass psql -h localhost -U wbuser -d wborders -f migrations/001_init.sqlgo mod downloadmake run
# Или
go run cmd/server/main.goСервис будет доступен по адресу: http://localhost:8080
# В новом терминале
make publisher
# Или
go run cmd/publisher/main.go -file model.json -count 10### GET /health
Проверка здоровья сервиса
```bash
curl http://localhost:8080/health
Статистика сервиса
curl http://localhost:8080/statsmake test# Публикация 1000 заказов
make publisher-stress
# WRK нагрузочное тестирование
wrk -t12 -c400 -d30s http://localhost:8080/api/orders/b563feb7b2b84b6test
# Vegeta
echo "GET http://localhost:8080/api/orders/b563feb7b2b84b6test" | vegeta attack -duration=30s -rate=1000 | vegeta reportwb-l0/
├── cmd/
│ ├── server/ # Основной сервис
│ │ └── main.go
│ └── publisher/ # Тестовый publisher
│ └── main.go
├── internal/
│ ├── cache/ # In-memory кэш
│ │ └── cache.go
│ ├── database/ # PostgreSQL репозиторий
│ │ └── repository.go
│ ├── handlers/ # HTTP handlers
│ │ └── handlers.go
│ ├── models/ # Модели данных
│ │ └── order.go
│ └── nats/ # NATS Streaming клиент
│ └── subscriber.go
├── web/
│ └── templates/ # HTML шаблоны
│ └── index.html
├── migrations/ # SQL миграции
│ └── 001_init.sql
├── docker-compose.yml # Docker окружение
├── Makefile # Команды для сборки
├── go.mod
├── go.sum
├── model.json # Пример заказа
└── README.md
DATABASE_URL=postgres://wbuser:wbpass@localhost:5432/wborders?sslmode=disable
NATS_CLUSTER_ID=wb-cluster
NATS_CLIENT_ID=wb-service-1
NATS_URL=nats://localhost:4222
NATS_SUBJECT=orders
PORT=8080- PostgreSQL с настроенной БД и пользователем
- Подключение к NATS Streaming с подпиской
- Запись данных в БД
- In-Memory кэш с восстановлением
- HTTP сервер с API
- Простой веб-интерфейс
- Валидация входящих данных
- Обработка ошибок
- Publisher для тестирования
- Graceful shutdown
- Автотесты (бонус)
- Подготовлено для стресс-тестирования (бонус)
- orders - основная таблица с JSONB
- delivery - информация о доставке
- payment - информация об оплате
- items - товары в заказе
Используется гибридный подход: JSONB для быстрой отдачи + нормализованные таблицы для аналитики.
make help
make full-setup
make status
make docker-logs
make docker-down
make cleanMIT