-
Notifications
You must be signed in to change notification settings - Fork 3
Statistics process description
Dmitriy Popov edited this page Jan 10, 2021
·
21 revisions
- KG-API — API Клавогонок
-
userId
/playerId
— идентификатор пользователя. Оба термина могут использоваться, они взаимозаменямы. Два названия связаны с кашей в KG-API, где используется иuser
, иplayer
. -
/get-summary
— запрос вида http://klavogonki.ru/api/profile/get-summary?id=242585. -
/get-index-data
— запрос вида http://klavogonki.ru/api/profile/get-index-data?userId=242585
- Выполняются запросы к KG-API для заданного диапазона юзеров, например,
playerId in [1; 625000]
. - Запросы из KG-API сохраняются в JSON-файлы
- JSON-файлы преобразуются через MapStruct в JPA-сущности
PlayerEntity
. -
PlayerEntity
сохраняются в базу MySQL. - На основе данных из БД через FreeMarker-шаблоны генерируются статические html и js файлы, представляющие собой сайт статистики.
- Все сгенерированные файлы, а также негенерируемая статическая часть (html + js + css) копируются в S3 Bucket, в котором хостится статистика.
- После загрузки в S3 нужно сделать Invalidate для обоих AWS CloudFront distribution, чтобы сайт обновился в CDN. Если не обновить, то закэшированная версия будет выдаваться во время TTL. Насколько я понял, TTL составляет порядка суток.
- В
PlayerSummaryDownloader
запускаютсяGET
запросы к API Клавогонок в заданном интервале[fromPlayerId; toPlayerId]
. - На текущий момент запускаются только запросы
/get-summary
и/get-index-data
. Будут добавлены как минимум запросы на саммари статистики и на ачивки. - Запросы суперпрямолинейны, просто
GET
в духеcurl
. То есть запросы НЕ работают через какие-либо REST-клиенты. - Следует отметить, что и при ошибке методы KG-API возвращают статус
200
, при этом там будет содержаться свойство"err"
, в котором будет содержаться текст ошибки. - В первой загрузке все запросы выполнялись последовательно, что длилось в районе 40 часов. Запросы нужно переделать на параллельные, что должно ускорить процесс.
- Результаты запросов сохраняются в заданную папку на диске. Каждый тип запроса сохраняется в свою директорию.
- ❗ ошибочные ответы (то есть ответы вида
{"err": "error text"}
) тоже сохраняются, чтобы была целостность данных и не было сомнений, выполнялся запрос по какому-тоuserId
или нет. - Каждый ответ сохраняется в свой файл, то есть путь к файлу выглядит в духе
<rootDir>/<importStartDateTime>/<queryType>/<playerId>.json
.
- ❗ ошибочные ответы (то есть ответы вида
- Запросы выполнялись на AWS EC2 Instance, как на месте со стабильным интернетом
- TODO: команда, запускающая. Описать, что собран über-jar для kgparserSrv.
- После выполнения директория с файлами зипуется и загружатеся в AWS S3 Bucket. Пока вручную.
- TODO: команды зипования и загрузки в S3.
- EC2 инстанс обладает ролью, дающей права писать в S3 Bucket.
- База данных MySQL.
- На текущий момент там одна плоская таблица
Player
.- Таблице соответствует JPA-сущность
PlayerEntity
. - Далее будут добавлены и другие таблицы для ачивок, словарей (возможно) и данных по словарям.
- Ответы от
/get-summary
и/get-index-data
парсятся через Jackson в Java-объекты и агрегируются в один объектPlayerJsonData
вPlayerJsonParser
.- ❗
PlayerJsonParser
содержит валидацию данных, которая была ослаблена под текущий набор данных. Теоретически на новых проблемных случаях эта валидация может упасть.
- ❗
-
PlayerJsonData
преобразуется вPlayerEntity
через MapStruct MapperPlayerMapper
.
- Таблице соответствует JPA-сущность
- Для работы с БД создан SpringBoot-модуль, причём это консольное приложение, без веба:
KgParserApplication implements CommandLineRunner
. - Схема БД авто-генерируется с помощью Hibernate. Если структура данных останется такой же простой, то теоретически можно достаточно безболезненно перезжать на другие БД при необходимости.
TODO:
TODO:
- Весь процесс должен быть автоматизирован и запускаться в одну команду.
- В супер-идеале вообще сделать автозапускаемую задачу по cron или подобному (например, в AWS можно по таймеру запускать Lambda).
- EC2 instance должен создаваться перед экспортом и удаляться после него.
- Нужно настроить CF (или более высокое API todo: как это называется? Создание CF программно.) для создания EC2.
Это должно включать настройку окружения (установку java 11 etc.).
- TODO: все команды, необходимые для запуска приложения на EC2.
- Можно настроить пайплайн на AWS Code Build etc. Там поддерживается взятие исходников из GitHub.
- БД должна создаваться для работы, после экспорта в статистику делается дамп DB, кладётся в S3, а сама БД дропается.
- Завершение или фейл шагов импорта должны через AWS SNS присылаться разработчикам (или вообще всем желающим подписавшимся) в SMS и на почту.
- А мб можно и в телеграм нотификацию настроить?? — Это должно быть возможно через самонаписанную Lambda, которая будет дёргать API Телеграма.
- В сайте должны содержаться и версии от предыдущих загрузок. Я вижу это так: новая версия всегда генерируется в поддиректорию от даты/времени, а также в основную директорию. Таким образом, дефолтная (она же свежая) версия всегда перезаписывается, но существуют копии того же веба в поддиректориях, которые не меняются.
- Ссылка на предыдущие также должна содержаться на самом сайте.