Очереди сообщений в Python
Когда вы работаете с приложениями, интенсивно использующими данные, длительные задачи могут серьезно замедлить работу ваших пользователей.
Современные пользователи ожидают, что страницы загружаются мгновенно, но выполнение задач с большим объемом данных может занять несколько секунд или даже минут. Как сделать так, чтобы пользователи работали быстро, но при этом выполняли сложные задачи?
Если мы хотим, чтобы у пользователей была быстрая загрузка нашего приложения, нам нужно будет переложить часть работы с нашего веб-сервера. Для этого пригодятся такие структуры как workers и Message Queues или очереди сообщений иначе.
Один из способов сделать это - асинхронность. Пока веб-сервер загружает следующую страницу, второй сервер выполняет необходимые нам вычисления в фоновом режиме. Эти фоновые, ориентированные на задачи серверы и называются workers.
Хотя обычно у вас есть только один или несколько веб-серверов, отвечающих на запросы пользователей, у вас может быть много рабочих серверов, которые обрабатывают задачи в фоновом режиме.
Затем эти рабочие могут вносить изменения в базу данных, обновлять пользовательский интерфейс с помощью веб-перехватчиков или обратных вызовов, добавлять элементы в кэш, обрабатывать файлы, отправлять электронные письма, ставить в очередь будущие задачи и многое другое! В то время как наш основной веб-сервер остается свободным, чтобы отвечать на запросы пользователей.
Очереди сообщений.
Мы говорим этим рабочим серверам, что делать, через очередь сообщений. Проще говоря, очередь — это структура данных первым пришел — первым обслужен. Когда мы храним сообщения в очереди, первое, что мы помещаем в очередь, будет обрабатываться первым. Все задачи будут запускаться в том порядке, в котором мы их добавляем.
Когда workers становится доступным, он берет первую задачу из начала очереди и начинает обработку. Если у нас много рабочих серверов, каждый выполняет задание по порядку. Очередь гарантирует, что каждый workers получает только одну задачу за раз и что каждая задача обрабатывается только одним работником.
Таким менеджером очередей для Python является Celery.
Celery позволяет web приложениям Python быстро реализовывать очереди задач для многих рабочих серверов. Он принимает независимые задачи, т.е. запросы пользователей и распределяет их между рабочими серверами - workers, а также прослушивает брокера сообщений отдельный сервер для поддержания очереди задач. Он принимает, новые запросы от клиентов и следит за прогрессом и статусом задач и рабочих серверов.
При использовании Celery c Django, общий принцип работы таков:
Django создает задачу (функция Python) и сообщает Celery, что надо добавить ее в очередь. Celery помещает эту задачу в Redis (освобождая Django для продолжения работы над другими вещами). На отдельном сервере Celery запускает workers, которые могут выполнять задачи. Эти рабочие сервера слушают Redis. Когда приходит новая задача, один worker берет ее и обрабатывает, записывая результат обратно в Celery.
Таким образом, используя очереди задач в web приложении, можно уменьшить время отклика при одновременном обращении множества пользователей.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.