Веб-сервис для приема и обновления данных о ценах товаров от различных производителей с расчетом средней цены в режиме реального времени. Приложение демонстрирует высокую степень параллелизма и возможность обработки множества сообщений одновременно.
- DatabaseService - сервис для работы с PostgreSQL через JDBC
- PriceProcessingService - сервис для параллельной обработки обновлений цен
- PriceUpdateServlet - HTTP сервлет для приема обновлений цен
- AveragePriceServlet - HTTP сервлет для получения средних цен
- Jetty Server - встроенный веб-сервер
- Java 11+
- Jetty - встроенный HTTP сервер
- PostgreSQL - база данных
- HikariCP - пул соединений
- Jackson - JSON обработка
- SLF4J + Logback - логирование
- Gradle - сборка проекта
- Java 11 или выше
- PostgreSQL 12 или выше
- Gradle 7.0 или выше
Создайте базу данных PostgreSQL:
CREATE DATABASE price_service;
CREATE USER price_user WITH PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE price_service TO price_user;Отредактируйте параметры подключения в DatabaseService.java:
config.setJdbcUrl("jdbc:postgresql://localhost:5432/price_service");
config.setUsername("price_user");
config.setPassword("your_password");./gradlew build./gradlew runПриложение запустится на порту 8080.
POST /api/prices/update
Content-Type: application/json
Пример запроса:
[
{
"product_id": 1,
"manufacturer_name": "Производитель A",
"price": 100.50
},
{
"product_id": 2,
"manufacturer_name": "Производитель B",
"price": 150.75
},
{
"product_id": 1,
"manufacturer_name": "Производитель C",
"price": 200.00
}
]Ответ:
{
"status": "success",
"message": "Price updates accepted for processing",
"data": 3
}GET /api/prices/average
Ответ:
{
"status": "success",
"message": "Average prices retrieved",
"data": [
{
"productId": 1,
"averagePrice": 150.25,
"offerCount": 2
},
{
"productId": 2,
"averagePrice": 150.75,
"offerCount": 1
}
]
}GET /api/prices/average/{productId}
Пример: GET /api/prices/average/1
Ответ:
{
"status": "success",
"message": "Average price retrieved",
"data": {
"productId": 1,
"averagePrice": 150.25,
"offerCount": 2
}
}- Использование
ExecutorServiceс пулом потоков размером с количество доступных процессоров CompletableFutureдля асинхронной обработкиReadWriteLockдля синхронизации доступа к базе данных
- Транзакционность при обновлении цен
- Использование
ON CONFLICTдля upsert операций - Автоматический пересчет средних цен при каждом обновлении
- Валидация входных данных
- Обработка SQL исключений
- Graceful shutdown приложения
- Подробное логирование всех операций
- Отслеживание производительности
- Логирование ошибок и исключений
./gradlew testПример с использованием curl:
# Обновление цен
curl -X POST http://localhost:8080/api/prices/update \
-H "Content-Type: application/json" \
-d '[
{"product_id": 1, "manufacturer_name": "Производитель A", "price": 100},
{"product_id": 2, "manufacturer_name": "Производитель B", "price": 150},
{"product_id": 1, "manufacturer_name": "Производитель C", "price": 200}
]'
# Получение всех средних цен
curl http://localhost:8080/api/prices/average
# Получение средней цены товара с ID 1
curl http://localhost:8080/api/prices/average/1Для еще более высокой производительности можно использовать:
- Apache Kafka для очередей сообщений
- Kafka Streams или Apache Flink для потоковой обработки
- Apache Cassandra для хранения данных
- Разделение на отдельные сервисы: Price Ingestion, Price Calculation, Price Query
- Использование Spring Boot для каждого сервиса
- Redis для кэширования средних цен
- MongoDB для хранения исторических данных
- Сохранение всех событий изменения цен
- Вычисление средних цен из событий
- Использование EventStore или Apache Kafka для хранения событий
Приложение оптимизировано для высокой нагрузки:
- Пул соединений HikariCP (20 соединений)
- Параллельная обработка обновлений
- Индексы в базе данных
- Асинхронные ответы API
Логи сохраняются в:
- Консоль (для разработки)
- Файл
logs/price-service.log(с ротацией по дням)
Уровни логирования:
INFO- основная информация о работе приложенияWARN- предупрежденияERROR- ошибки и исключенияDEBUG- детальная отладочная информация