Лучший способ создания очереди для обработки запросов к REST Api, созданной через Django
У меня есть следующий сценарий:
- Back end => геопространственная база данных и инструмент Open Data Cube .
- API => Пользователи могут определять параметры (xmin,xmax,ymin,ymax) для выполнения GET запросы
- Process => При каждом запросе вычисляется аналитика и значения пикселей спутникового значения пикселей спутниковых изображений возвращаются пользователю
Мой вопрос заключается в следующем: Поскольку процесс довольно тяжелый (он может резервировать много ГБ оперативной памяти), как можно обрабатывать несколько запросов одновременно? Есть ли какая-нибудь очередь, в которой я могу хранить запросы и последовательно обслуживать каждый из них?
Язык/фреймворки => Python 3.8 и Django
Заранее спасибо
Celery + Rabbitmq/Redis - это, вероятно, то, что вам нужно.
В этой конфигурации ваши тяжелые процессы становятся "задачами". При вызове с помощью .delay() они попадают в очередь и больше не обрабатываются вашим основным процессом.
Вы можете проверить туто
https://docs.celeryproject.org/en/stable/django/first-steps-with-django.html
Существует множество технологий асинхронных очередей сообщений, которые позволяют это сделать, многие из которых имеют API для Python.
Вероятно, вы хотите использовать обмен сообщениями "запрос-ответ", чтобы соотнести полученные запросы с ответами, которые вы хотите отправить.
Технология очередей сообщений позволит вам принимать запросы, хранить их в очереди, а серверу обрабатывать их, когда он будет готов. Хранение запросов в очереди означает, что они не потеряются. Это также позволяет вашему приложению масштабироваться - по мере поступления запросов их могут обрабатывать несколько экземпляров приложения, и при этом возвращать только один результат!
В ответе выше рекомендуется celery, который является отличным выбором для такого рода проектов. В зависимости от требований, которые у вас есть, вы также можете использовать pymqi (пример здесь для использования шаблона запрос-ответ) ZeroMQ - Multiple Publishers and Listener, если вам нужно что-то более тяжелое.