Skip to content

VIVERA83/derbit

Repository files navigation

Derbit


1. Описание

Сервис для криптобиржи Deribit. Раз в минуту сервис делает запрос к api биржи за данными по текущей цене BTC (БИТКОИН) и ETH (Эфириум) полученные данные сохраняются в базу данных. Для работы с сохраненными данными есть Api:

  • /all получить все данные по криптовалюте
  • /last получить последний запись по криптовалюте
  • /get_between получить данные по криптовалюте за период

Подробная информация по Api:


2. Запуск сервиса

  • Клонируем репозиторий:
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

3. Техническое описание реализации сервиса

Стек:

  1. asyncio
  2. aiohttp
  3. apscheduler
  4. sqlalchemy 2.0+ (async)
  5. postgresql
  6. fastapi
  7. dataclasses
  8. pytest-asyncio/pytest

Физически сервис состоит из трех компонентов

  1. Внутренний сервис
  2. Внешний сервис
  3. База данных 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

About

Сервис по взаимодействию с крипто биржей derbit

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published