...
Для полноценного понимания, что такое REST API, настоятельно рекомендуется прочитать и понять следующую статью: https://cloud.yandex.ru/ru/docs/glossary/rest-api
Используемые технологии:
Веб-сервер:
Для работы бэкенда используется язык программирования Python (как наиболее оптимальный с точки зрения простоты/известности/скорости разработки) и фреймворк Django REST Framework (как наиболее удобный за счёт наличия большинства необходимых функций "из коробки", будь то работа с СУБД/авторизация/кеширование/фоновые задания и т.д.). Этот фреймворк позволяет быстро и эффективно "строить" веб-сервисы, использующие протокол REST API.
База данных и ORM:
Для хранения данных используется реляционная база данных PostgreSQL. При этом мы не пишем sql-запросы руками, вместо этого мы используем ORM (для ознакомления рекомендую эту статью) - фреймворк для работы с данными (конкретно мы используем ORM, включенную в библиотеку Django, она так и называется: Django ORM), который позволяет работать с сущностями, представленными в виде Python-классов и методами этих классов, вместо работы с таблицами БД и sql-запросами соответственно.
...
Мы очевидно взаимодействуем с базой данных, создавая/получая данные оттуда, но при этом не написали ни одного sql-запроса, а работаем с абстрактной сущностью (в дальнейшем "сущность" будем именовать "Моделью"). Для дальнейшего знакомства с Django ORM рекомендуется эта статья https://habr.com/ru/articles/503526/
Кэширование:
В дополнение к реляционной базе данных мы дополнительно используем in-memory (т.е. хранящую все данные в оперативной памяти) key-value (т.е. хранящую данные в виде ассоциативного массива ключ-значение) базу данных Redis. За счёт работы в оперативной памяти Redis является очень быстрым хранилищем, отлично подходящим для кэширования часто запрашиваемых данных, и хранения временной информации.
Фоновые задания:
И, наконец, ещё одна значимая область бэкенда - это фоновые задания. Обычно взаимодействие с пользователем происходит в формате "запрос-ответ": пользователь отправил запрос, бэкенд сходил в БД, достал данные и отдал их в ответе. Однако иногда в результате запроса требуется запустить какое-либо задание, окончания которого не нужно дожидаться "здесь и сейчас" - например, при бронировании стиральной машинки мы хотим отправить пользователю уведомление в ВК за 10 минут до начала бронирования. Для выполнения таких "фоновых" заданий требуется отдельный механизм.
...
Для выполнения асинхронных задач у нас запускаются отдельные программы - воркеры фоновых задач. Они спрашивают RabbitMQ о новых сообщениях, и при получении сообщения начинают выполнять указанную функцию. Эти воркеры
Celery (фреймворк фоновых задач) написан также на Python и замечательно интегрируется с Django, позволяя использовать один и тот же код и на стороне отправителя сообщений (веб-сервера Django), и на стороне получателя сообщений (celery-воркера, обрабатывающего фоновые задания). Таким образом воркеры (в дальнейшем будем называть их Celery-воркеры, или консьюмеры/Consumers) - это такие же python-приложения, только запущенные с другими параметрами. Благодаря использованию одинаковой кодовой базы с веб-сервером, эти воркеры понимают, о какой именно функции "говорил" веб-сервер, и как её выполнять, избегая нас (разработчиков) от явного описания, как "отправитель" и "получатель" должны между собой взаимодействовать.
Архитектурно получается следующая картинка:
...
Для понимания всего вышесказанного настоятельно рекомендуется прочитать и понять следующую статью
Резюме
Для разработки бэкенд-части сервиса мы используем язык Python.
Работу веб-сервера и REST API обеспечивают библиотеки Django и Django-rest-framework
Для хранения данных мы используем реляционную БД PostgreSQL, а для кэширования и хранения часто меняемых/временных данных - Redis
Для работы с фоновыми задачами мы используем фреймворк Celery, а в качестве "транспорта" для передачи сообщений от веб-сервера к воркеру используем RabbitMQ