Skip to content

NSergeev260/demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Проект по созданию сервера для работы с транспортными картами
=============================================================
                        Тех. задание

Карты могут быть кредитными и дебетовыми
Кредитные карты - именные, с возможностью ездить в долг
Дебетовые карты - безымянные, без возможности задолжать

Операции по картам:
- оплата по тарифу в зависимости от транспорта
- пополнение счета
- просмотр баланса
- блокировка карты

Необходимо хранить историю операций по картам в БД
Подробное логирование событий

Написать эмулятор обращения к сервису
=============================================================
                Принцип работы приложения

- Созданная карта вносится в БД
- БД имеет две таблицы: Card и History
- Card:
       cardId VARCHAR(36) NOT NULL,         //UUID()
       balance DECIMAL(8, 2) NOT NULL,
       type VARCHAR(6),
       cutOffBankDept DECIMAL(5, 2) NOT NULL,
       isBlocked BOOLEAN NOT NULL,
       PRIMARY KEY(cardID);

- History:
        cardId VARCHAR(255) NOT NULL,
        operation VARCHAR(36) NOT NULL,
        result BOOLEAN NOT NULL,
        amount VARCHAR(255) NOT NULL,
        date VARCHAR(255) NOT NULL,
        balanceAfterOperation VARCHAR(255) NOT NULL,
        PRIMARY KEY(cardID);

JOIN по cardID
- В зависимости от вида транспорта будет списываться определенная сумма
- Карты, в зависимости от их типа(кредитные или дебетовые), будут иметь опцию поездок в долг
- Иметь индивидуальный Id
- Также будут иметь возможность оплачивать поездку, пополнять счет, смотреть статус
- Логика работы терминала будет подразумевать через cardID производить оплату поездки,
  оплату поездки в долг, пополнение счета, блокировку и создание карты
- Терминал будет связан с сервером, а сервер с БД
- Admin подразумевается как контроллер с полным набором функций. Способен будет производить
  оплату проезда, поездки в долг, пополнение счета, предоставление баланса, хранение истории
  операций и блокировку карт
- ID терминала хранить в истории


Уже сделано:
Абстрактный класс реализующий интерфейс
Enum с видами карт
Классы карт, расширяющие абстрактный класс
Enum транспорта со стоимостью проезда
Класс сервиса карт
Класс сервиса оплаты
Класс, временно заменяющий БД
Контроллер Терминал
Контроллер Админ
MySQL файл со скриптами
Создать 10 тестовых карт
Использовать JDBC(вместо списка карт, которые хранятся в памяти программы)
Переместить скрипт инициализации БД в случае отсутствия базы данных
Тесты на контроллеры и сервис классы
Добавить тесты
Переместить в application.yml настройки, которые в коде
Поменять JDBC на Hibernate

Написать эмулятор:
Задача эмулятора - протестировать приложение, как если бы обращалось одновременно много
клиентов (терминалов) с различными запросами в течение определённого периода времени.

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

Выбор операции должен иметь определённую разумную вероятность.
Например:
4% вероятности того, что пользователь положил деньги на счёт
(случайная сумма в определённых пределах)
90% вероятности, что сгенерируется запрос на списание денег (тип транспорта выбирать с равной вероятностью)
1% на то, что карта должна быть заблокирована и столько же на обратную операцию
3% на то, что будет запрос баланса
1% на создание новой карточки

Все операции должны быть тщательно залогированы.

Все эти операции должны работать в n потоков
(конкретное число потоков должно задаваться через параметры командной строки при запуске)

Так же эмулятор должен работать ограниченное количество минут
(время так же должно быть передано через параметры)

Протестировать приложение с помощью этого эмулятора с разным количеством потоков
 и разным временем работы. Результаты записать в readme.

Как минимум:
4 потока, 5 минут
10 потоков 5 минут
40 потоков 2 минуты

Найти максимум того, на что способен компьютер. Отслеживать по количеству записей в HistoryCard

 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+   ЦП    |	43% - норма(только рутинные приложения)      +
+   ОЗУ   | 5.8Гб состояние относительного покоя(из 8Гб) +
+   Начальное количество карт на итерацию: 10 шт         +
 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+                               JDBC                                        +
+ ========================================================================= +
+   4 потока и 5 минут    |    кол-во записей в card_db.card_history: 28091 +
+ _________________________________________________________________________ +
+   ЦП    |    100%       |	                                                +
+   ОЗУ   |    =7.2Гб=    |	                                                +
+ ========================================================================= +
+   10 потоков и 5 минут  |    кол-во записей в card_db.card_history: 29892 +
+ _________________________________________________________________________ +
+   ЦП    |    100%       |	                                                +
+   ОЗУ   |    =6.6Гб=    |	                                                +
+ ========================================================================= +
+   40 потоков и 2 минуты |    кол-во записей в card_db.card_history: 12530 +
+ _________________________________________________________________________ +
+   ЦП    |    100%       |	                                                +
+   ОЗУ   |    =6.4Гб=    |	                                    	        +
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+                               Hibernate                                   +
+ ========================================================================= +
+   4 потока и 5 минут    |    кол-во записей в card_db.card_history: 23296 +
+ _________________________________________________________________________ +
+   ЦП    |    100%       |	                                                +
+   ОЗУ   |    =6.8Гб=    |	                                                +
+ ========================================================================= +
+   10 потоков и 5 минут  |    кол-во записей в card_db.card_history: 26882 +
+ _________________________________________________________________________ +
+   ЦП    |    100%       |	                                                +
+   ОЗУ   |    =7.0Гб=    |	                                                +
+ ========================================================================= +
+   40 потоков и 2 минуты |    кол-во записей в card_db.card_history: 9817  +
+ _________________________________________________________________________ +
+   ЦП    |    100%       |	                                                +
+   ОЗУ   |    =6.6Гб=    |	                                    	        +
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Осталось сделать:
Задача со звёздочкой на будущее - определить методы,
которые занимают наибольшее количество времени работы программы,
подумать, как можно их оптимизировать, чтобы программа работала быстрее,
соответственно, была бОльшая пропускная способность приложения.


About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages