Skip to content

Repository files navigation

WB L0 - Order Management Service

Тестовое задание для проекта «Лабс» 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)  │  └──────────┘
                                 └─────────┘  └───────┘

Принципы работы

  1. Publisher публикует заказы в NATS Streaming
  2. Service подписывается на канал и получает сообщения
  3. Валидация данных перед обработкой
  4. Сохранение в PostgreSQL (транзакция)
  5. Сохранение в In-Memory Cache
  6. Подтверждение обработки (ACK)
  7. HTTP API отдаёт данные из кэша

Требования

  • Go 1.21+
  • Docker & Docker Compose
  • Make (опционально)

1. Клонирование репозитория

git clone <your-repo-url>
cd wb-l0

2. Запуск инфраструктуры

make docker-up
# Или без Make
docker-compose up -d

3. Применение миграций

make migrate-up
# Или напрямую
PGPASSWORD=wbpass psql -h localhost -U wbuser -d wborders -f migrations/001_init.sql

4. Установка зависимостей

go mod download

5. Запуск сервиса

make run
# Или
go run cmd/server/main.go

Сервис будет доступен по адресу: http://localhost:8080

6. Публикация тестового заказа

# В новом терминале
make publisher
# Или
go run cmd/publisher/main.go -file model.json -count 10
### GET /health
Проверка здоровья сервиса

```bash
curl http://localhost:8080/health

GET /stats

Статистика сервиса

curl http://localhost:8080/stats

Тестирование

Unit тесты

make 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 report

Структура проекта

wb-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

Конфигурация

Environment Variables

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 clean

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages