Сервис для криптобиржи Deribit. Раз в минуту сервис делает запрос к api биржи за данными по текущей цене BTC (БИТКОИН) и ETH (Эфириум) полученные данные сохраняются в базу данных. Для работы с сохраненными данными есть Api:
- /all получить все данные по криптовалюте
- /last получить последний запись по криптовалюте
- /get_between получить данные по криптовалюте за период
Подробная информация по Api:
-
Swagger документация http://127.0.0.1:8000/docs
-
Swagger(альтернатива) http://127.0.0.1:8000/redoc
Точная ссылка к документации выводится в логах при запуске сервиса.
- Клонируем репозиторий:
git clone git@github.com:VIVERA83/derbit.git
- Переходи в папку с проектом:
cd derbit
- Создаем файл .env (с переменными окружения) на основе примера .env_example*:
echo "COMPOSE_PROJECT_NAME="derbit"
# Настройка приложения
LOGGING_LEVEL="DEBUG"
LOGGING_GURU="1"
HOST="0.0.0.0"
PORT=8004
TRACEBACK="False"
# Настройка Postgres
POSTGRES__DB=test_db
POSTGRES__USER=test_user
POSTGRES__PASSWORD=password
POSTGRES__HOST=postgres_derbit
POSTGRES__PORT=5432
POSTGRES__DB_SCHEMA=derbit
POSTGRES_DB="${POSTGRES__DB}"
POSTGRES_USER="${POSTGRES__USER}"
POSTGRES_PASSWORD="${POSTGRES__PASSWORD}"
POSTGRES_HOST="${POSTGRES__HOST}"
POSTGRES_PORT="${POSTGRES__PORT}"
#app
LOGGING__GURU=True
LOGGING__TRACEBACK=True
" >>.env
В ОС windows можно скопировать фаил .env_example в .env
командой copy
, это будет равнозначно команде
выше
copy /Y ".env_example" ".env"
- Запускаем приложение в контейнере:
docker-compose up --build
Стек:
- asyncio
- aiohttp
- apscheduler
- sqlalchemy 2.0+ (async)
- postgresql
- fastapi
- dataclasses
- pytest-asyncio/pytest
Физически сервис состоит из трех компонентов
- Внутренний сервис
- Внешний сервис
- База данных PostgresSQL
- Внутренний сервис:
- Задача: внутреннего сервиса обращаться с периодичностью в 1 минуту за данными по крипте и записывать полученные данные в БД.
- Реализация: Сервис при старте поднимает соединение с БД и биржей
по web socket`у, далее поднимается планировщик и формируется
задание на получение данных по валютам и запись в БД.
Так как, данные по обеим валютам приходили практически мгновенно возникала конкуренция за соединение с БД в
результате чего, терялась информация по одной из валют. Для решения данной проблемы используется синхронизатор Lock
из asyncio. К сожалению подключиться к websocket``у биржи не всегда удается с первого раза, для решения данной проблемы
используется декоратор before_execution который в течение минуты делает попытки выполнения метода отвечающего за соединение с биржей.
За основу взят aiohttp, apscheduler, asyncio, sqlalchemy 2.0+ (async), dataclasses - Возможный альтернативный вариант реализации: Можно пученные данные от планировщика класть в очередь которую слушает Worker. Задача Worker класть данные в БД.
- Внешний сервис:
- Задача: Отработка запросов к api на полученные данные из БД.
- Реализация: Сервис при старте поднимает соединение с БД При получении данных от клиента проводится валидация полученных данных и в случае если данные корректны выполняется запрос к БД с последующим возвратом клиенту. В случае получения некорректных данных клиент получает сообщение об ошибке с указанием причины ошибки. За основу взят fastapi, asyncio, sqlalchemy 2.0+ (async), dataclasses