Skip to content

Latest commit

 

History

35 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Сервис получения данных о заказах на маркетплейсе.

Одна из работ с моего обучения в техношколе Wildberries.
Этот проект представляет собой демонстрационный сервис, который обрабатывает и отображает данные о заказах, используя асинхронные методы для большей эффективности, кеширование in-memory для снижения нагрузки на базу данных и различные API: gRPC и HTTP.
Приложение соответствует чистой архитектуре.

🏗️ Организация работы

Сервис состоит из нескольких основных компонентов, каждый из которых выполняет свою уникальную роль:

  1. Консьюмер Kafka (Асинхронно)
    📥 Подписывается на топик в Kafka и читает сообщения о новых заказах.
    📝 Сообщения содержат данные о заказах в определенном формате.

  2. Сервис обработки
    🔄 Получает данные о заказах от консьюмера Kafka.

    • Асинхронная запись в БД: Записывает данные заказа в базу данных PostgreSQL.
    • Асинхронная запись в кэш: Сохраняет данные заказа в кэш Redis.
  3. Сервис чтения
    📡 Обрабатывает запросы на получение информации о заказе по его идентификатору.

    • Проверка кэша: Сначала проверяет наличие данных в кэше Redis.
    • Возврат из кэша: Если данные найдены, они немедленно возвращаются.
    • Чтение из БД и кэширование: Если данных нет в кэше, сервис запрашивает их из PostgreSQL, записывает в кэш и возвращает клиенту.
  4. Методы представления (Асинхронные)

    • gRPC API: Предоставляет интерфейс gRPC для взаимодействия с другими микросервисами.
    • REST API: Обеспечивает RESTful API для запросов через HTTP.

📡 gRPC

Методы gRPC API в основном предназначены для взаимодействия с другими микросервисами.

  • 📂 В пакете internal/configs/grpcConfig/testClient представлен пример кода клиента.
  • 📜 Описание protobuf-файла находится в пакете proto.
  • 🔧 В пакете api/grpcAPI сгенерированный protobuf код для работы сервера.

🌐 HTTP

Базовый 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"
  }

🗄️ Redis

Сервис кэширования предназначен для снижения нагрузки на базу данных.

  • 🗃️ Используется in-memory NoSQL key-value хранилище Redis.
  • ⏳ Данные о заказе хранятся в кэше 30 секунд, после чего автоматически удаляются.

📬 Apache Kafka

Реализована подписка на топик Orders, который принимает сообщения о новых заказах.

  • 📜 Сообщения должны соответствовать заранее определенному формату (JSON) для корректной интерпретации.

📦 PostgreSQL

Вся информация о заказах хранится в базе данных 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)

About

Service for displaying orders data for the marketplace.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages