Автор оригинала: Richard Lowe.
Обо мне
Сторонник новых технологий и улучшения условий жизни людей с их помощью.
Почему я хотел научиться сельдерею
С помощью приложений с одним процессом управление этими иногда очень интенсивными задачами ввода-вывода может быть несколько хлопотным. Работая в одном приложении, есть варианты для многопроцессорной обработки или потоков, но я хотел что-то такое, что было бы типом submit and forget.
Идея асинхронной очереди действительно очаровала меня. Сам факт отправки задания в очереди на какой-то удаленный сервер, а затем того, чтобы другая машина потребляла эти задачи, как у нее было время, действительно вызывал воображение. Вы можете иметь много производителей, много потребителей и всю обработку отдельно от основного приложения с автономным исполнением.
То, что это представляло для моего приложения, – это бесшовный и отзывчивый опыт для пользователей, в то же время выполняющих множество других задач.
Как я подошел к изучению сельдерея
Мой проект включал в себя несколько уведомлений по электронной почте, файловые операции, техническое обслуживание. Отправка этих уведомлений может быть серьезным узким местом для приложения, поэтому я экспериментировал с операциями асинхронного типа и нашел красноречивое решение. Экспериментирование с различными подходами к этой проблеме может дать отличные результаты.
Сначала я попробовал нитки. Но обнаружил, что это замедлит всю обработку заявки. Хотя он работал немного лучше, чем в основном потоке, он не был масштабируемым.
Далее шла обработка в рамках собственного процесса. Казалось, что это слишком большие накладные расходы, чтобы создать процесс, а затем обработать его. Хотя производительность была намного лучше, чем многопоточный вариант, он все еще имел слишком много накладных расходов, чтобы иметь дело с ними.
Первым шагом в любой распределенной очереди задач является брокер, который будет необходим для связи как с производителем, так и с потребителем. Брокер чем-то напоминает базу данных, но с более упрощенной функцией. В случае задач он будет хранить идентифицирующую информацию о создании задачи, а также входные данные и результаты задачи.
Поддерживаются несколько типов брокеров.
- Rabbitmq
- Редис
- Amazon SQS
- Смотритель зоопарка
Я свое дело, я выбрал Редис. Установка проста и понятна. dnf install redis
, бум, готово.
Установка сельдерея так же проста: pip install celery
или если вы хотите получить конкретный pip install celery[redis]
Оттуда вы готовы играть.
Проблемы, с которыми я столкнулся
Изменения происходят везде, когда пробуешь что-то новое. Вероятно, одной из самых больших ловушек является адаптация к стилю кодирования другого пользователя или к тому, как он взаимодействует с набором данных. Довольно распространенная проблема для меня-найти время и быть достаточно терпеливым, чтобы понять подход, который был принят.
Пожалуй, самая проблемная проблема с сельдереем-это отсутствие прозрачности получения результатов запущенного процесса. Документация иногда не является вашим другом и может просто оставить вас в еще большем замешательстве. Но методом проб и ошибок обычно решается большинство вопросов.
Как только вы добьетесь успеха в получении статуса обратно в первый раз, это будет легко после этого:
@celery.task(bind=True) def database_backup(self): """Database backup - runs in the background. :note: Encryption cycle is intensive and will take several minutes to complete :param self: :return: """ filename = ''.join(random.choice(string.ascii_letters) for m in range(16)) tmp_db = '/tmp/db_backup.sql' tmp_db2 = '/tmp/' + filename if os.path.exists(tmp_db): os.remove(tmp_db) self.update_state(state=STARTED, meta={'message': 'database backup started'})
Последняя строка является ключевой, update_state
– это то, как вы информируете свое приложение о состоянии задачи, которая была отправлена в очередь.
Ключевые выносы
Как всегда, вынос из любого из этих экспериментов-это то, чего вы не знали раньше. Узнав об асинхронных очередях, я открыл совершенно новый мир масштабируемости для приложений, с которыми работаю.
Новое правило. Если это то, что вам нужно сделать, но не зависит от непосредственных результатов, асинхронная обработка действительно может вдохнуть в приложение больше производительности.
Советы и рекомендации
Совет для большинства новых технологий-создать себе виртуальное рабочее пространство. Тот, в котором можно играть и устраивать беспорядок. Следующий и последний шаг-играть, устраивать беспорядок, пробовать все вкусы.
Заключительные мысли и следующие шаги
Для тех, кому нужна масштабируемая очередь задач, я нашел хорошее решение в celery. Вы можете начать с него по адресу: http://www.celeryproject.org/где вы найдете некоторые основные примеры и рекомендации по началу работы.