Мой проект - демонстрационный сервис на Go с использованием базы данных и очереди сообщений. Сервис получает данные заказов из очереди (Kafka), сохраняет их в базу данных (PostgreSQL) и кэширует в памяти для быстрого доступа.
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/create | Создание заказа |
| GET | /api/v1/order/:orderId | Получение заказа по Id |
| GET | /api/v1/stresstest/:orderId | Тестовый эндпоинт для сравнения скорости доступа к кэшу и бд |
Сервис реализует консюмер Kafka, который работает в режиме постоянного чтения очереди.
- Получение заказа из Kafka.
- Валидация структуры сообщения (JSON → модель Go).
- Проверка бизнес-правил (например, уникальность
order_uid). - Сохранение заказа в PostgreSQL.
- Подтверждение обработки (commit offset).
- Формат сообщений: JSON (структура строго соответствует модели
Order). - Масштабируемость: консюмер может быть запущен в нескольких экземплярах, распределение сообщений происходит через consumer group.
- Обработка ошибок:
- при ошибке валидации сообщение пропускается;
- при ошибке записи в БД — логирование;
- Гарантия доставки: как минимум один раз (at-least-once).
{
"order_uid": "user12345",
"track_number": "WBILMTESTTRACK",
"entry": "WBIL",
"delivery": {
"name": "Test Testov",
"phone": "+9720000000",
"zip": "2639809",
"city": "Kiryat Mozkin",
"address": "Ploshad Mira 15",
"region": "Kraiot",
"email": "test@gmail.com"
},
"payment": {
"transaction": "b563feb7b2b84b6test",
"request_id": "",
"currency": "USD",
"provider": "wbpay",
"amount": 1817,
"payment_dt": 1637907727,
"bank": "alpha",
"delivery_cost": 1500,
"goods_total": 317,
"custom_fee": 0
},
"items": [
{
"chrt_id": 9934930,
"track_number": "WBILMTESTTRACK",
"price": 453,
"rid": "ab4219087a764ae0btest",
"name": "Mascaras",
"sale": 30,
"size": "0",
"total_price": 317,
"nm_id": 2389212,
"brand": "Vivienne Sabo",
"status": 202
}
],
"locale": "en",
"internal_signature": "",
"customer_id": "test",
"delivery_service": "meest",
"shardkey": "9",
"sm_id": 99,
"date_created": "2021-11-26T06:22:19Z",
"oof_shard": "1"
}При запуске сервиса данные из PostgreSQL предварительно подгружаются в кэш.
- При добавлении нового заказа данные в кэше не обновляются сразу.
- Кэш обновляется только при вторичном запросе к одному и тому же заказу.
- Инвалидация выполняется с помощью TTL:
- каждые 30 секунд запускается фоновая функция;
- проверяется, сколько заказов находится в кэше;
- устаревшие записи удаляются.
Были проведены замеры скорости доступа к данным:
| Метрика | Значение |
|---|---|
| Количество запросов к кэшу | 100 000 |
| Среднее время доступа к кэшу | 16ns |
| Полное время всех обращений к кэшу | 1.6425ms |
| Время одного запроса к БД | 3.7308ms |
📊 Вывод: доступ к данным через кэш работает намного быстрее, чем прямые обращения к базе данных.
В качестве базы данных используется PostgreSQL.
Для создания и управления схемой базы данных применяются миграции, которые находятся в папке migrations/.
В базе данных предусмотрена одна таблица orders:
| Поле | Тип | Описание |
|---|---|---|
| order_uid | VARCHAR(50) | Уникальный идентификатор заказа (PRIMARY KEY) |
| track_number | VARCHAR(50) | Трек-номер посылки |
| entry | VARCHAR(10) | Канал/точка входа заказа |
| locale | VARCHAR(10) | Локаль заказа (язык, страна) |
| internal_signature | VARCHAR(50) | Внутренняя подпись/токен |
| customer_id | VARCHAR(50) | Идентификатор покупателя |
| delivery_service | VARCHAR(50) | Служба доставки |
| shardkey | VARCHAR(10) | Шард-ключ для распределения данных |
| sm_id | INTEGER | Внутренний идентификатор SM |
| date_created | VARCHAR(50) | Дата создания заказа |
| oof_shard | VARCHAR(10) | Шард OOF |
| delivery | JSONB | Информация о доставке (имя, адрес, контакты) |
| payment | JSONB | Информация об оплате |
| items | JSONB | Список товаров заказа |
Проект написан на языке Go и использует следующие библиотеки и инструменты:
- Go (версия 1.24.0)
В проекте используются следующие ключевые Go-библиотеки:
| Библиотека | Назначение | Документация |
|---|---|---|
github.com/ilyakaznacheev/cleanenv |
Чтение и валидация конфигурации из окружения и файлов (.env, .yaml, .json) |
ссылка |
github.com/joho/godotenv |
Загрузка переменных окружения из .env файлов |
ссылка |
github.com/google/uuid |
Генерация и парсинг UUID (уникальных идентификаторов) | ссылка |
| Библиотека | Назначение | Документация |
|---|---|---|
github.com/gin-gonic/gin |
Высокопроизводительный HTTP-фреймворк для создания REST API | ссылка |
github.com/gin-contrib/cors |
Middleware для обработки CORS-запросов в Gin | ссылка |
| Библиотека | Назначение | Документация |
|---|---|---|
github.com/jackc/pgx/v5 |
Высокопроизводительный драйвер PostgreSQL (работа с транзакциями, пулами, COPY и т.д.) | ссылка |
github.com/Masterminds/squirrel |
SQL query builder для удобной генерации SQL-запросов | ссылка |
github.com/segmentio/kafka-go |
Клиент Kafka для продюсеров и консумеров на Go | ссылка |
| Библиотека | Назначение | Документация |
|---|---|---|
go.uber.org/zap |
Быстрое структурированное логирование с минимальным оверхедом | ссылка |
├── cmd/ #Основной исполняемый файл проекта
├── config/ #Конфигурационные файлы
├── docs/ # Swagger документация
├── demonstration/ # Видео для демонстрации
├── frontend/ # Фронтенд сервиса
├── internal/ # Внутренняя бизнес-логика (не предназначена для внешнего использования)
│ ├── app/ # Инициализация приложения
│ ├── config/ # Конфигурация приложения
│ ├── kafka/ # Взаимодействие с kafka
│ ├── models/ # Модели данных
│ ├── repository/ # Слой взаимодействия с базой данных
│ ├── service/ # Слой бизнес-логики
│ ├── transport/ # Слой взаимодействия с пользователем
├── migrations/ # Скрипты миграций базы данных
├── pkg/ # Публичные пакеты, доступные извне (reusable)
│ ├── logger/ # Пакет логирования
│ ├── postgres/ # Пакет работы с базой данных PostgreSQLДля запуска проекта необходимо выполнить следующие шаги:
git clone https://github.com/VladimirGladky/WBTechTestTask.git
cd WBTechTestTask
Теперь вы можете запустить проект , но для этогт нужно чтобы был установлен Go версии 1.24.0 Ссылка для скачивания: Go Download
Перед запуском сервиса , воспользуйтесь командой
go mod downloaddocker compose upВы запустите базу данных , и утилиты для взаимодействия с kafka
Для остановки в будущем используйте:
docker compose downПотом выполните вот это:
go run ./cmd/main.goЗапустится сервер и потом запустите веб-интерфейс:
Перейдите в папку frontend:
cd frontendДля запуска вам потребуется npx , вы можете установить его по ссылке https://nodejs.org/en:
npx serveВеб-интерфейс будет открыт по ссылке http://localhost:3000, там вы можете ввести id заказа и получить данные о нём
Это будет выглядеть примерно вот так:
