Одна из работ с моего обучения в техношколе Wildberries.
Этот проект представляет собой демонстрационный сервис, который обрабатывает и отображает данные о заказах, используя асинхронные методы для большей эффективности,
кеширование in-memory для снижения нагрузки на базу данных и различные API: gRPC и HTTP.
Приложение соответствует чистой архитектуре.
Сервис состоит из нескольких основных компонентов, каждый из которых выполняет свою уникальную роль:
-
Консьюмер Kafka (Асинхронно)
📥 Подписывается на топик в Kafka и читает сообщения о новых заказах.
📝 Сообщения содержат данные о заказах в определенном формате. -
Сервис обработки
🔄 Получает данные о заказах от консьюмера Kafka.- Асинхронная запись в БД: Записывает данные заказа в базу данных PostgreSQL.
- Асинхронная запись в кэш: Сохраняет данные заказа в кэш Redis.
-
Сервис чтения
📡 Обрабатывает запросы на получение информации о заказе по его идентификатору.- Проверка кэша: Сначала проверяет наличие данных в кэше Redis.
- Возврат из кэша: Если данные найдены, они немедленно возвращаются.
- Чтение из БД и кэширование: Если данных нет в кэше, сервис запрашивает их из PostgreSQL, записывает в кэш и возвращает клиенту.
-
Методы представления (Асинхронные)
- gRPC API: Предоставляет интерфейс gRPC для взаимодействия с другими микросервисами.
- REST API: Обеспечивает RESTful API для запросов через HTTP.
Методы gRPC API в основном предназначены для взаимодействия с другими микросервисами.
- 📂 В пакете
internal/configs/grpcConfig/testClientпредставлен пример кода клиента. - 📜 Описание protobuf-файла находится в пакете
proto. - 🔧 В пакете
api/grpcAPIсгенерированный protobuf код для работы сервера.
Базовый URL: http://localhost:8080/api/?id='your_uid'
Этот сервер предназначен для работы с браузерами. Ответ возвращается в формате JSON.
{
"order_uid": "b563feb7b2b84b6test",
"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": "10",
"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": "test",
"customer_id": "test",
"delivery_service": "meest",
"shardkey": "9",
"sm_id": 99,
"date_created": "2021-11-26T06:22:19Z",
"oof_shard": "1"
}Сервис кэширования предназначен для снижения нагрузки на базу данных.
- 🗃️ Используется in-memory NoSQL key-value хранилище Redis.
- ⏳ Данные о заказе хранятся в кэше 30 секунд, после чего автоматически удаляются.
Реализована подписка на топик Orders, который принимает сообщения о новых заказах.
- 📜 Сообщения должны соответствовать заранее определенному формату (JSON) для корректной интерпретации.
Вся информация о заказах хранится в базе данных PostgreSQL, что обеспечивает надежное и долгосрочное хранение данных.
- 🔑 PostgreSQL используется в качестве основного источника данных для сервиса.
- 📝 Все методы API проходят через middleware для логирования запросов.
- 📂 Логирование реализовано с помощью библиотеки UberZap, файлы логов находятся в пакете
logs. - 🐳 Все компоненты приложения, включая очередь сообщений, базу данных и кэш-сервис, контейнеризированы.
- 🧩 Внедрение зависимостей (Dependency Injection) реализовано с использованием библиотеки Google Wire.
В проекте используются следующие технологии:
- Go: Язык программирования для основного кода сервиса.
- Kafka: Брокер сообщений для асинхронной обработки данных.
- Redis: In-memory NoSQL key-value хранилище для кэширования.
- PostgreSQL: Реляционная база данных для хранения данных о заказах.
- gRPC: Протокол для создания производительных API.
- REST: Архитектурный стиль для создания HTTP API.
- Docker: Для контейнеризации приложения и его зависимостей.
- Docker Compose: Для управления несколькими контейнерами.
- Dev Containers: Для согласованной среды разработки.
- UberZap: Для логирования работы приложения.
- google/wire: Внедрение зависимостей (Dependency Injection)