- Таблицы БД:
orders
,users
,withdrawals
,schema_migrations
- Пароли пользователей хэшируем sha256
- Сжимаем только запросы, возвращающие списки
- Авторизация через заголовок и cookie, jwt token
- Баллы храним в decimal формате (github.com/shopspring/decimal), чтобы без погрешностей (в БД varchar)
- Баланс не храним, вычисляем по надобности
- Опрашиваем accrual одним воркером в цикле
Использовать параллельные воркеры я не стал из-за нескольких причин:
- неизвестные характеристики сервиса accrual (заявлена ошибка HTTP 429)
- необходимость синхронизации работы воркеров, что будет необоснованным усложнением
Чтобы убрать бесконечные запросы к БД в случае отсутствия новых заказов, реализовал следующее: OrderFetcher
"засыпает" на минуту, если не находит ни одного заказа (запрос раз в минуту может пригодиться, если, например, техподдержка добавила/отредактировала заказы в БД). При добавлении нового заказа через API OrderFetcher
получает сигнал к пробуждению.
- Не указана точность подсчета баллов accrual
- Хотим избежать погрешностей в работе с чем-то хотя бы как-то связанным с деньгами
Альтернативно рассматривал возможность приводить числа к integer с фиксированной точностью, но решил, что уже протестированная библиотека с документацией – лучше для такой общеизвестной проблемы.