Code Monkey home page Code Monkey logo

dummymessenger_fastapi's Introduction

Задача: DummyMessenger

Напишите два файла на Python: первый файл - сервер DummyMessenger, второй - клиент, который тестирует скорость работы DummyMessenger.

Сервер

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

При запуске сервер должен инициализировать базу данных, создавая таблицу для сообщений, если она не существует на момент запуска.

Сервер должен предоставлять один метод HTTP POST, который:

  • получает JSON-сообщение, содержащее имя отправителя и текст, и сохраняет его в базу данных (выбор конкретной базы данных не имеет принципиального значения)
  • возвращает JSON с последними 10 (или меньшим количеством, если история не накопилась) сообщениями, включая текущее
  • каждое сообщение в ответе должно содержать имя отправителя, текст сообщения, дату отправки, порядковый номер сообщения и количество сообщений от текущего пользователя
  • дату, порядковый номер и счётчик сообщений пользователя необходимо вычислить в момент сохранения и записать в базу данных

Следующие моменты имеют принципиальное значение:

  • в ответе на запрос не должны присутствовать сообщения, полученные после текущего запроса
  • в ответе на запрос не должны пропускаться сообщения
  • порядковые номера сообщений не должны совпадать
  • у сообщений от одного пользователя не должны совпадать счётчики сообщений Такие ситуации могут возникнуть, когда сервер обрабатывает два запроса асинхронно (или две параллельно работающие реплики сервера обрабатывают запросы одновременно). Необходимо предусмотреть и предотвратить такие ситуации с помощью инструментов базы данных.

Клиент

Клиент должен поддерживать запросы к нескольким репликам одного сервера. Например, в клиенте можно указать два URL с разными портами сервера, и запрос будет отправлен на случайно выбранный сервер. Клиент должен отправлять текстовые сообщения от имени случайных пользователей, выбираемых из списка из десяти имен. Запросы должны отправляться асинхронно из 50 одновременно запущенных корутин. Каждая корутина последовательно отправит 100 запросов и завершит работу. В конце клиент должен подсчитать время, за которое было выполнено 5000 запросов, время работы одного запроса и общую пропускную способность серверов.

Просьба учесть следующие дополнительные требования:

  • Результаты выполнения задания должны быть размещены на GitHub. Создайте открытый репозиторий на GitHub, загрузите код двух файлов (сервер и клиент) в репозиторий и предоставьте нам ссылку на этот репозиторий в вашем ответе. Убедитесь, что репозиторий содержит все необходимые файлы для воспроизведения и проверки результатов.
  • В README файле репозитория должна быть предоставлена информация о том, как воспроизвести результаты выполнения задания. Укажите шаги или инструкции, которые нам следует выполнить, чтобы проверить ваше решение и протестировать сервер DummyMessenger на двух одновременно запущенных репликах. Это может включать необходимые зависимости, команды для запуска сервера и клиента, а также любую другую информацию, которая может быть полезной для проверки вашего решения. Оформи этот текст более структурированно и красиво в Marcdown

Установка зависимостей и запуск проекта

  • для правильной работы рекомендуется Python 3.10

  • код программы проверян на ОС Windows 10 без Docker и в ОС Ubuntu 22.04 c использованием Docker

способ №1 (тестировалось в Ubuntu 22.04)

1. создать виртуальное окружение virtualenv server и активировать source server/bin/activate

2. Установить зависимости pip install -r requirements.txt. Далее создать файл .env для переменных окружения в корне проекта:

пример:

USER=user
PASSWORD=123321
DB=server

3. В качестве базы данных рекомендуется использовать PostgreSQL

  • для более быстрого и простого подключения к базе будет лучшим создание докер образа и контейнера postgresql

4. Выполнить команду docker compose up -d и дождаться запуска контейнера с образом PostgreSQL

4. запустить файл server.py python server.py

5. запустить файл client.py python client.py

6. дождаться завершения работы программы "клиента" client.py и получить результат.

Способ №2 (Только для Ubuntu 22.04 либо на более ранних версиях с устнаовленным Python 3.10 и установленным Docker)

1. создать виртуальное окружение virtualenv server и активировать source server/bin/activate

2. Установить зависимости pip install -r requirements.txt.

3. В качестве базы данных рекомендуется использовать PostgreSQL

  • для более быстрого и простого подключения к базе будет лучшим создание докер образа и контейнера postgresql

4. Выполнить команду sh dep_pstgr.sh, дождаться выполнения программы и получить результат. Рекомендуется использовать Ubuntu 22.04 либо раннюю версию, например 20.04 с устнавленным Python 3.10.

Если изначально выбран 2-ой способ и он не дал результат по техничесским ошибкам, то выполнить Способ №1.

Если Docker не установлен ни в Windows ни в Ubuntu, то Способ №1 можно выполнить без пукта 4, но в таком случае PostgreSQL должен быть установлен на хост машине, с созданной базой, пользователем и паролем, значения которых потом определить в переменных окружения в файле .env

dummymessenger_fastapi's People

Contributors

stanleyig avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.