This application implemented on top of Redis. Server settings situated in the /resources/application_config.properties
Ваша задача написать приложение, реализующее переданный во вложении интерфейс
Метод destroy()гарантированно вызывается перед завершением приложения.
Требования к системе:
1. Запросы к вашей реализации интерфейса будут идти в 100 потоков, и класс
должен безошибочно обрабатывать как можно больше запросов в секунду.
2. Информация о зарегистрированных клиентах и остатках их квот должна быть
персистентной, то есть сохраняться в базе данных между запусками программы.
При некорректном завершении программы допускается частичная потеря данных,
однако не более чем за последние 3 секунды. При корректном завершении
программы ошибки должны быть исключены.
3. Программа должна быть многопоточной и распределённой (то есть допускать
возможность запуска нескольких экземпляров программы на разных машинах,
работающих с единой базой данных).
4. Допустимо отставание программы не более чем на 3 секунды (то есть возможна
отдача случайных чисел вместо исключений в течение 3 секунд после того, как
была израсходована вся квота, а также отдача исключений вместо случайных
чисел в течение 3 секунд после регистрации клиента или увеличения его квоты).
Статистика, выдаваемая методом getQuota(), также может отставать на интервал до 3 секунд.
5. В базе может быть зарегистрировано до миллиона клиентов. Специфика запросов
такова, что 80% запросов будут совершаться от лица одного (самого крупного)
клиента, ещё 19% запросов будут совершаться от лица 100 клиентов “поменьше”, и
1% запросов будет совершаться от лица остальных клиентов. Интенсивность
запросов одного конкретного клиента может меняться в ходе работы сервиса.
6. Помимо интерфейса, вам передаётся приложение, совершающее запросы к вашей
реализации интерфейса в 100 потоков и выводящее в консоль производительность
системы за последнюю секунду.