Проекты

Кейс: за две недели разработали сервис подсчета результатов для образовательного портала

Кейс: за две недели разработали сервис подсчета результатов для образовательного портала

Коротко о проекте

  • 01
    Инструмент

    Django — фреймворк на Python

  • 02
    Задача

    Создать сервис обработки данных для платформы онлайн-обучения

  • 03
    Почему выбрали Django
    • Нужна быстрая разработка: фреймворк позволяет использовать готовые решения и не писать лишний код
    • Не нужен веб-интерфейс: Django подходит именно для бэкенд-разработки
    • Стандартный API: использовали готовые решения на базе библиотеки django-rest-framework для подключения REST API
    • Взаимодействие с базой данных: Django ORM, функциональный инструмент для работы с БД
  • 04
    Результаты
    • Сервис дополняет функции платформы
    • Стабильное непрерывное обновление данных — у клиента платформы 50 000 пользователей
    • Обработка данных от одного пользователя занимает доли секунды
    • База данных хранит 100 Мб обезличенной информации о пользователях — промежуточные и конечные результаты по всем тестам на платформе
    • Telegram-бот отправляет уведомления администратору сервиса, если возникают технические ошибки

Платформа онлайн-обучения зарабатывает на подписке

Заказчик — платформа для организации дистанционного обучения. Компании-клиенты покупают подписку на услуги платформы и собирают в конструкторе курсы для обучения персонала: прокачки профессиональных умений, навыков общения, адаптации новых сотрудников.

Скриншот платформы
На платформе можно собирать курсы самостоятельно, заказывать их разработку команде платформы или покупать готовые, например курсы по продажам

Сотрудники смотрят лекции, вебинары, отрабатывают навыки на тренажерах и проходят тесты для контроля знаний. Результаты тестов и рейтинг прохождения курсов компании-клиенты видят в своем личном кабинете на платформе.

Проблема: у крупного клиента особый запрос

У платформы появился клиент с особым запросом. Ему было удобно работать с курсами, но оказалось недостаточно видеть результаты тестирований и рейтинг сотрудников в личном кабинете. Он хотел размещать их у себя на сайте. Для этого данные нужно отправлять не на платформу, а на сервер компании.

Вносить изменения в саму платформу долго и дорого. Нужно было быстро разработать отдельный сервис обработки данных, который хранит статистику пользователей, считает результаты по всем заданиям и отправляет их на сервер клиента. За решением платформа обратилась в OrbitSoft.

Решение: сервис обработки данных на Django

Мы обсудили с заказчиком требования к сервису и сформулировали техническое задание. Нам предстояло реализовать:

  • HTTP API endpoint — для принятия и обработки веб-хуков;
  • базу данных — для хранения результатов;
  • обработчик очереди задач — для отправки результатов после обработки веб-хуков;
  • интеграцию с Telegram — для отправки уведомлений.

Мы предложили разрабатывать сервис на Django — фреймворке Python. Он подходит по нескольким причинам:

  • Сервис нужно разработать быстро, иначе клиент платформы уйдет к конкурентам. Фреймворк Django позволяет использовать готовые решения и не писать лишний код — разработка сервиса, включая согласование и тестирование, в итоге заняла у нас 2 недели.
  • Сервис не требует отдельного веб-интерфейса, с которым взаимодействует пользователь. Его задача — восполнить отсутствующие функции между платформой и сервером компании-клиента. Django подходит именно для бэкенд-разработки.
  • Сервису нужны стандартный API и взаимодействие с базой данных. У Django есть готовые решения для этих задач. Мы использовали библиотеку django-rest-framework для подключения REST API и инструмент Django ORM для работы с БД.

Как работает сервис

Схема 1

Метод 1:

  • Принимает данные с сервера платформы через веб-хук. Это автоматически сгенерированный HTTP-запрос, который ускоряет обмен данными. Сервису нужно получить результаты теста пользователя от сервера платформы. Но он не знает, прошел пользователь тест или нет. При использовании стандартных запросов сервис периодически спрашивает платформу: есть результаты? Если на момент запроса тест пройден, сервер присылает в ответ данные. А веб-хук — это как подписка на событие. Как только пользователь прошел тест, сервер автоматически создает HTTP-вызов и отправляет данные сервису. Через веб-хук сервис быстрее получает данные и не нагружает сервер частыми запросами.
  • Когда данные поступили, метод 1 проверяет их на соответствие требуемой структуре и сохраняет в базе данных.
  • Если возникает проблема во время обработки запроса, метод 1 передает ошибку в метод 3. Если все успешно — формирует задачу на отправку результатов на сервер компании-клиента для метода 2.

Метод 2:

  • Запрашивает в базе данных суммарный результат по пользователю — по всем тестам, которые он выполнил.
  • Подготавливает и передает на сервер компании-клиента обновленные данные
Скрипт
Метод 2 формирует из информации, которую передает платформа, объекты заданной структуры. Это нужно, чтобы сервис мог воспринять поступающие данные и работать с ними дальше
  • Если возникает ошибка при обращении к базе данных или отправке данных на сервер клиента, метод 2 передает ее методу 3.

Метод 3:

  • Отправляет на сервер Telegram сообщения об ошибках, которые присылают методы 1 и 2.

Подключили к сервису базу данных

Для хранения промежуточных результатов мы создали базу данных. Когда пользователь завершает тест, метод 1 передает информацию в базу. Пользователь выполняет еще задание, результаты опять поступают в базу, данные дополняются.

Метод 2 запрашивает суммарный результат по пользователю у базы и отправляет на сервер клиента платформы.

Схема 2
В базе данных хранятся промежуточные итоги и формируется суммарный результат по каждому пользователю

Реализовали REST API для работы веб-хука

Через веб-хук сервис обработки данных получает информацию от сервера о том, что на платформе произошло событие: пользователь прошел тест. За получение веб-хука отвечает метод 1: он принимает запрос на URL сервиса.

Основные этапы работы:

1. Описали модели базы данных User и Result.

Скрипт
Миграция, полученная после описания моделей в БД

2. Добавили библиотеку DRF и описали:

  • сериализаторы данных. Это объекты, описывающие структуру принимаемых данных и правила для их валидации — проверки на соответствие заданным условиям.
Скрипт
Сериализатор информации о результате пользователя
  • метод View — метод обработки HTTP-запроса, включающий правила разграничения доступа.

3. Настроили роутинг — задали URL, по которому будут приниматься запросы, и связали его с обработчиком View.

4. Добавили отлов ошибок на ключевых этапах: запись в БД, валидация структуры данных.

Скрипт
Пример поведения сервиса при получении неверных данных через веб-хук

Реализовали выполнение отложенных задач

Метод 2 отвечает за передачу суммарного результата пользователя на сервер компании-клиента. Для этого он запрашивает его в базе данных, формирует объект необходимой структуры и отправляет на сервер.

Отправка результатов выполняется не сразу после поступления данных, это отложенный процесс. Когда сервер платформы присылает веб-хук, метод 1 обрабатывает его и формирует для метода 2 задачу: отправить на сервер обновленный результат. Задача встает в очередь из таких же задач. Их выполнение реализовано через Celery.

Схема 3
Celery — библиотека для выполнения задач из очередей

Брокер сообщений выполняет функцию диспетчера очереди: принимает и отдает сообщения между отдельными модулями. В этом проекте мы использовали Redis.

Celery по порядку вытягивает задачи из очереди и выполняет их: запрашивает в базе данных суммарный результат по пользователю и отправляет его на сервер компании-клиента. Обработчик Celery имеет несколько исполнителей и работает в фоновом режиме.

Если в процессе выполнения возникнет ошибка, Celery записывает ее в лог и в течение минуты еще несколько раз пробует осуществить запрос. Уведомления об ошибках сервис присылает в виде отчета в Telegram-канал, чтобы администратор мог своевременно отреагировать.

Написали бота, который сообщает об ошибках

Одним из пожеланий заказчика было настроить уведомления об ошибках. Они могут возникать при обращении сервиса к внутренней базе данных, при попытке отправить запрос на сервер компании-клиента или может быть ошибка в структуре данных, переданных с платформы. Если администратор уведомлен, он может своевременно принять меры.

Django позволяет настроить взаимодействие сервиса со сторонними программами, например с Telegram. Для отправки сообщений об ошибках мы написали бота-помощника.

Скрипт
Бот отправляет сообщения об ошибках с помощью метода 3 в сервисе обработки данных

Результат: сервис обрабатывает данные 50 000 пользователей

Благодаря фреймворку Django мы разработали сервис обработки данных менее чем за 2 недели с начала получения ТЗ. Наши результаты:

  • Сервис решает задачу заказчика: производит вычисления, сохраняет данные в БД, затем передает конечный результат на сервер компании-клиента.
  • Сервис аккумулирует данные 50 000 пользователей компании-клиента. Они хранятся во внутренней базе данных и используются при обновлении информации: например, когда пользователь прошел еще один тест и сумма баллов изменилась.
  • В случае ошибки в передаче данных система отправляет администратору уведомление в Telegram.

Технический блок

Фреймворк

Django

Язык программирования

Python

Библиотеки

Django
Djangorestframework
Celery
Redis
Requests
Psycopg2

Базы данных
PostgreSQL

Платформы и стороннее ПО

Docker
Nginx

Получите ответ по смс

Ваше сообщение успешно отправлено!
Представьтесь пожалуйста
Укажите номер, на который придет ответ
Нажимая на кнопку, вы даете согласие
на обработку персональных данных.

Перезвонить вам, чтобы ответить на вопросы?

Когда с вами связаться?

Связаться по телефону:+7 499 321-59-32

Нажимая на кнопку, я принимаю условия политики и пользовательского соглашения

Фото эксперта
Дмитрий

Проектный менеджер

Получите ответ на ваш вопрос в любимом мессенджере

Выберите удобный мессенджер и начните диалог прямо сейчас

Telegram WhatsApp

Рассчитать стоимость проекта

Расскажите о вашем проекте, чтобы мы могли проконсультировать вас.

Напишите ваше имя
Укажите ваш email

Выберите удобный для вас способ связи

Мы сразу получим ваш запрос и поможем в решении проблемы

Написать в Telegram

Написать в WhatsApp

Позвонить нам