Рубрики
Без рубрики

Как я научился сельдерею

Мое первое свидание с Сельдереем.

Автор оригинала: 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/где вы найдете некоторые основные примеры и рекомендации по началу работы.