Skip to content

amirjons/microservices-shop

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Интернет-магазин "Гоzон"

Проект представляет собой систему из нескольких микросервисов для обработки заказов и платежей. Основной упор сделан на асинхронное взаимодействие, отказоустойчивость и гарантию целостности данных при высоких нагрузках.

Стек: Python (FastAPI), PostgreSQL, RabbitMQ, Redis, React.


🛠 Запуск приложения

Весь проект полностью докеризирован.

  1. Клонирование Перейдите в папку с проектом.

  2. Сборка и запуск

    docker compose up --build
  3. Ожидание старта


🚀 Как пользоваться

Вариант 1: Фронтенд

Интерфейс доступен по адресу: http://localhost:3000

  1. Введите User ID (любое число, например, 1) в шапке сайта.
  2. Перейдите на вкладку «💰 Счет» и нажмите «+ Создать счет».
  3. Пополните баланс на любую сумму.
  4. Перейдите на вкладку «📦 Заказы» и создайте заказ.
  5. Наблюдайте за сменой статуса (NEW -> FINISHED) и всплывающими уведомлениями.

Вариант 2: Swagger (Для проверки API)

Документация API Gateway: http://localhost:8000/docs

Вариант 3: RabbitMQ Dashboard

Панель управления брокером: http://localhost:15672

  • Логин: guest
  • Пароль: guest Можно мониторить очереди orders.to_pay и payment.results.

🏗 Архитектура и реализация требований

Система разбита на независимые компоненты, как и требовалось в задании.

1. Сервисы

  • API Gateway: Единая точка входа. Проксирует HTTP-запросы в нужный сервис и держит WebSocket-соединения с клиентами.
  • Orders Service: Управление заказами. Работает в двух инстансах для демонстрации балансировки нагрузки.
  • Payments Service: Управление счетами и транзакциями.

2. Асинхронность и надежность

Вместо прямых HTTP-вызовов между сервисами используется RabbitMQ.

  • Гарантия доставки: При создании заказа в Orders Service , он сразу создаётся в одной транзакции с заказом сохраняется запись в таблицу outbox_messages. Отдельный фоновый процесс (worker_outbox.py) вычитывает эти записи и отправляет их в брокер. Это гарантирует, что даже если брокер упадет в момент заказа, сообщение не потеряется и уйдет позже.

  • Идемпотентность: В Payments Service при получении сообщения сначала проверяется его уникальный ID в таблице inbox_messages. Если сообщение уже обрабатывалось, оно игнорируется. Это обеспечивает семантику exactly-once.

3. Конкурентность

Чтобы баланс не уходил в минус и не было "гонки" при одновременных запросах, используется пессимистичная блокировка БД: SELECT ... FOR UPDATE Это держит строку счета заблокированной до конца транзакции списания или пополнения.

4. WebSocket и масштабирование

Реализована схема с Redis Pub/Sub.

  • Когда статус заказа меняется, воркер публикует событие в Redis.
  • API Gateway (и другие инстансы) слушают Redis и пересылают уведомление конкретному пользователю в WebSocket.
  • Это позволяет пользователю получать пуш-уведомления независимо от того, к какому инстансу бэкенда он подключен.

5. Дополнительно

  • Реализован красивый UI на React + CSS (Dark mode, анимации, скелетоны).

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors