Из обязательного функционала только перевод денег между пользователями. Дополнительно условие: нельзя перевести пользователю деньги если на его счету больше чем N средств.
Достаточно работы сервиса из консоли без GUI клиента.
Предпочтительна реализация на чистом Python либо с минимальным использования фреймворков.
Так как в рамках задания не предполагается аутентификации в базе данных создается одна таблица, содержащя данные пользователя.
id
- суррогатный ключname
- естественный ключ (имя человека)- Так же хранятся огранчиения на количество денег и текущее доступное количество.
Выполнение огранчиений контролируется средствами БД.
Для работы требуется Python 3.6
- Установите зависимости (их мало):
pip3 install -r requirements.txt
- Настройте параметры досутпа к базе данных Postgresql в файле
production.yml
. При необходимости так же укажите параметры тестового сервера вtest.yml
- Инициализируйте БД с помощью скрипта
src/init.py
- Добавьте пользователей с помощью
src/add_user.py
. Например,./src/add_user.py -n tishka17 --max 1000 -c 1
- Переводите деньги с помощью скрипта
src/transfer.py
и смотрите текущее состояние с помощьюsrc/get.py
. Напрмиер,./src/transfer.py -f tishka17 -t ivan -1
Аутентификация и авторизация пользователей возможна с помощью одного из вариантов:
- Внешний сервер (LDAP)
- Таблица, содержащая хэши паролей
Для масштабирования системы предлагается шардировать пользователей по серверам:
- На одном сервере ведется таблица соответствия id пользователя и id шарда.
- При регистрации пользователя он сохраняется на одном из шардов
- ПРи добавлении шарда на него могут быть перемещены некоторые существующие пользователи в фоновом режиме
- При необходимости перевода денег
- Определяются на каких шардах находятся пользвоатели
- Если они в прежелах одного шарда, вызывается алгоритм обычного перевода денег в одной транзакции
- Если пользователи раположены на разных шардах, используются распределенных транзакции (2PC или 3PC)