Микросервис для управления балансами кошельков с поддержкой горизонтального шардирования PostgreSQL. Сервис предоставляет REST и gRPC API для операций с кошельками.
- Backend: Golang 1.25.6
- Database: PostgreSQL
- API: gRPC + REST (HTTP Gateway)
- Контейнеризация: Docker Compose
- Тестирование: Testify
- Документация API: Swagger/OpenAPI
WalletService/
├── api/ # API файлы
├── cmd/app/ # Точка входа приложения
├── config/ # Конфигурация приложения
├── internal/ # Внутренние пакеты
│ ├── services/ # Бизнес-логика
│ ├── storage/ # Шардированное хранилище
│ │ └── pgstorage/
│ │ └── migrations/# Миграции для шардов
│ └── pb/ # Protobuf модели и API
├── scripts/ # Вспомогательные скрипты
└── .github/workflows/ # Автозапуск тестов
Используем шардирование по 64 бакетам с распределением по 32 бакета на 2 инстанса Postgres:
- Шард 0: бакеты 0-31
- Шард 1: бакеты 32-63
Алгоритм распределения по бакетам построен на основе хэша от uuid кошелька
Каждый бакет хранится в отдельной схеме PostgreSQL:
-- Пример для bucket_0
CREATE SCHEMA bucket_0;
CREATE TABLE bucket_0.wallets (
id UUID PRIMARY KEY,
balance BIGINT NOT NULL CHECK (balance >= 0),
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);-
Клонировать репозиторий:
git clone https://github.com/J0hnLenin/WalletService cd ./WalletService -
Собрать и запустить контейнеры:
docker compose up -d
-
Проверить статус:
docker compose ps
Все настройки содержатся в config.env
- Порт:
8080
| Метод | Endpoint | Описание |
|---|---|---|
| POST | /api/v1/wallet |
Применение операции (пополнение/списание) |
| GET | /api/v1/wallets/{walletId} |
Получение баланса кошелька |
- Порт:
50001 - Сервис:
WalletsService - Методы:
ApplyOperation(Operation) returns (Wallet)GetBalance(GetBalanceRequest) returns (Wallet)
curl -X GET "http://localhost:8080/api/v1/wallets/550e8400-e29b-41d4-a716-446655440000"Ответ:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"balance": "1000"
}curl -X POST "http://localhost:8080/api/v1/wallet" \
-H "Content-Type: application/json" \
-d '{
"walletId": "550e8400-e29b-41d4-a716-446655440000",
"operationType": "DEPOSIT",
"amount": "500"
}'curl -X POST "http://localhost:8080/api/v1/wallet" \
-H "Content-Type: application/json" \
-d '{
"walletId": "550e8400-e29b-41d4-a716-446655440000",
"operationType": "WITHDRAW",
"amount": "200"
}'{
"id": "string (UUID)",
"balance": "string (int64)"
}{
"walletId": "string (UUID)",
"operationType": "DEPOSIT | WITHDRAW",
"amount": "string (int64)"
}make run-testsmake gen-moksmake gen-apimake goda-graph