Модульбанк

Python FastAPI aiohttp asyncio

🧪 Тестовое задание — Python Backend

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

Это задание составлено так, чтобы продемонстрировать навыки, которые мы используем в работе каждый день. Если у тебя возникнут вопросы или понадобится дополнительная информация — не стесняйся обращаться к нам.

Удачи!

🧠 Задача: DummyMessenger

Напишите два файла на Python:

  • Первый файл — сервер DummyMessenger
  • Второй файл — клиент, тестирующий скорость работы DummyMessenger

📡 Сервер

Сервер должен быть реализован с использованием асинхронного фреймворка (например, aiohttp, FastAPI и др.).

При запуске:

  • Инициализирует базу данных
  • Создает таблицу сообщений, если она не существует

Эндпоинты:

POST /

Получает JSON-сообщение с: - именем отправителя - текстом сообщения

Действия сервера: - Сохраняет сообщение в БД - Возвращает JSON с последними 10 сообщениями, включая текущее

Ответ должен содержать:

  • Имя отправителя
  • Текст сообщения
  • Дату отправки
  • Порядковый номер сообщения
  • Количество сообщений от текущего пользователя

🕓 Дата, порядковый номер и счетчик сообщений должны вычисляться в момент сохранения и записываться в БД.

⚠️ Ключевые требования:

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

Такие ситуации могут возникнуть при асинхронной/параллельной обработке — предусмотрите защиту с помощью инструментов БД.

🤖 Клиент

Клиент должен:

  • Поддерживать запросы к нескольким репликам сервера
  • (например: два URL с разными портами)
  • Отправлять сообщения от случайных пользователей (10 имен в списке)
  • Работать с 50 асинхронными корутинами
  • Каждая отправляет 100 последовательных запросов
  • Всего 5000 запросов

В конце клиент должен подсчитать:

  • Общее время выполнения всех 5000 запросов
  • Среднее время на один запрос
  • Общую пропускную способность (requests/sec)

📤 Что предоставить

  • 📁 Открытый репозиторий на GitHub
  • Файлы: сервер + клиент
  • Все зависимости (например, requirements.txt)
  • 📘 README.md, в котором описано:
  • Как воспроизвести результаты
  • Как запустить 2 реплики сервера
  • Как запустить клиента
  • Любая дополнительная информация, которая поможет в тестировании

🛠️ Технологии и инструменты (рекомендации)

  • FastAPI / aiohttp
  • asyncio, aiohttp (для клиента)
  • Любая СУБД: PostgreSQL, SQLite, etc.
  • SQL-блокировки, транзакции, уникальные индексы — для предотвращения коллизий