Что нового в Celery 4.3 (ревень)

Автор:

Омер Кац (<< 0 >>>)

Celery - это простая, гибкая и надежная распределенная система для обработки огромного количества сообщений, предоставляющая операторам инструменты, необходимые для обслуживания такой системы.

Это очередь задач, ориентированная на обработку в реальном времени, а также поддерживающая планирование задач.

Celery имеет большое и разнообразное сообщество пользователей и разработчиков, вам стоит присоединиться к нам on IRC или << 1 >>>.

Чтобы узнать больше о сельдерее, вам следует перейти по ссылке introduction.

Хотя эта версия обратно совместима с предыдущими версиями, важно, чтобы вы прочитали следующий раздел.

Эта версия официально поддерживается на CPython 2.7, 3.4, 3.5, 3.6 и 3.7, а также на PyPy2 и PyPy3.

Предисловие

Выпуск 4.3.0 продолжает совершенствовать наши усилия по предоставлению вам лучшей платформы для выполнения задач на Python.

Этот релиз получил кодовое название Rhubarb, которое является одним из моих любимых треков с Selected Ambient Works II.

Этот выпуск посвящен новым функциям, таким как новые бэкенды результатов и обновленный сериализатор безопасности, а также исправлениям ошибок, в основном для Celery Beat, Canvas, ряду критических исправлений для зависающих рабочих и исправлениям для нескольких серьезных утечек памяти.

Celery 4.3 - это первый выпуск, поддерживающий Python 3.7.

Мы надеемся, что 4.3 станет последним выпуском, поддерживающим Python 2.7, поскольку сейчас мы начинаем работу над Celery 5, следующим поколением нашей платформы для выполнения задач.

Однако, если Celery 5 будет отложен по какой-либо причине, мы можем выпустить еще одну минорную версию 4.x, которая по-прежнему будет поддерживать Python 2.7.

Если будет выпущена очередная версия 4.x, она, скорее всего, откажется от поддержки Python 3.4, поскольку его EOL наступит в марте 2019 года.

Мы также сосредоточились на снижении трения по вкладам.

Благодаря Josue Balandrano Coronel, одному из наших основных участников, у нас теперь есть обновленный документ Contribution getting started. Если вы собираетесь внести свой вклад, пожалуйста, ознакомьтесь с ним при первой же возможности.

Я также добавил новые шаблоны вопросов, которые мы будем продолжать совершенствовать, чтобы открытые вами вопросы содержали больше релевантной информации, которая позволит нам легче помочь вам решить их.

- Омер Кац

Стена вкладчиков

Alexander Ioannidis <a.ioannidis.pan@gmail.com> Amir Hossein Saeid Mehr <amir.saiedmehr@gmail.com> Andrea Rabbaglietti <rabbagliettiandrea@gmail.com> Andrey Skabelin <andrey.skabelin@gmail.com> Anthony Ruhier <anthony.ruhier@gmail.com> Antonin Delpeuch <antonin@delpeuch.eu> Artem Vasilyev <artem.v.vasilyev@gmail.com> Asif Saif Uddin (Auvi) <auvipy@gmail.com> aviadatsnyk <aviad@snyk.io> Axel Haustant <noirbizarre@users.noreply.github.com> Benjamin Pereto <github@sandchaschte.ch> Bojan Jovanovic <bojan.jovanovic.gtech@gmail.com> Brett Jackson <brett@brettjackson.org> Brett Randall <javabrett@gmail.com> Brian Schrader <brian@brianschrader.com> Bruno Alla <browniebroke@users.noreply.github.com> Buddy <34044521+CoffeeExpress@users.noreply.github.com> Charles Chan <charleswhchan@users.noreply.github.com> Christopher Dignam <chris@dignam.xyz> Ciaran Courtney <6096029+ciarancourtney@users.noreply.github.com> Clemens Wolff <clemens@justamouse.com> Colin Watson <cjwatson@ubuntu.com> Daniel Hahler <github@thequod.de> Dash Winterson <dashdanw@gmail.com> Derek Harland <donkopotamus@users.noreply.github.com> Dilip Vamsi Moturi <16288600+dilipvamsi@users.noreply.github.com> Dmytro Litvinov <litvinov.dmytro.it@gmail.com> Douglas Rohde <douglas.rohde2@gmail.com> Ed Morley <501702+edmorley@users.noreply.github.com> Fabian Becker <halfdan@xnorfz.de> Federico Bond <federicobond@gmail.com> Fengyuan Chen <cfy1990@gmail.com> Florian CHARDIN <othalla.lf@gmail.com> George Psarakis <giwrgos.psarakis@gmail.com> Guilherme Caminha <gpkc@cin.ufpe.br> ideascf <ideascf@163.com> Itay <itay.bittan@gmail.com> Jamie Alessio <jamie@stoic.net> Jason Held <jasonsheld@gmail.com> Jeremy Cohen <jcohen02@users.noreply.github.com> John Arnold <johnar@microsoft.com> Jon Banafato <jonathan.banafato@gmail.com> Jon Dufresne <jon.dufresne@gmail.com> Joshua Engelman <j.aaron.engelman@gmail.com> Joshua Schmid <jschmid@suse.com> Josue Balandrano Coronel <xirdneh@gmail.com> K Davis <anybodys@users.noreply.github.com> kidoz <ckidoz@gmail.com> Kiyohiro Yamaguchi <kiyoya@gmail.com> Korijn van Golen <korijn@gmail.com> Lars Kruse <devel@sumpfralle.de> Lars Rinn <lm.rinn@outlook.com> Lewis M. Kabui <lewis.maina@andela.com> madprogrammer <serg@anufrienko.net> Manuel Vázquez Acosta <mvaled@users.noreply.github.com> Marcus McHale <marcus.mchale@nuigalway.ie> Mariatta <Mariatta@users.noreply.github.com> Mario Kostelac <mario@intercom.io> Matt Wiens <mwiens91@gmail.com> Maximilien Cuony <the-glu@users.noreply.github.com> Maximilien de Bayser <maxdebayser@gmail.com> Meysam <MeysamAzad81@yahoo.com> Milind Shakya <milin@users.noreply.github.com> na387 <na387@users.noreply.github.com> Nicholas Pilon <npilon@gmail.com> Nick Parsons <nparsons08@gmail.com> Nik Molnar <nik.molnar@consbio.org> Noah Hall <noah.t.hall@gmail.com> Noam <noamkush@users.noreply.github.com> Omer Katz <omer.drow@gmail.com> Paweł Adamczak <pawel.ad@gmail.com> peng weikang <pengwk2@gmail.com> Prathamesh Salunkhe <spratham55@gmail.com> Przemysław Suliga <1270737+suligap@users.noreply.github.com> Raf Geens <rafgeens@gmail.com> (◕ᴥ◕) <ratson@users.noreply.github.com> Robert Kopaczewski <rk@23doors.com> Samuel Huang <samhuang91@gmail.com> Sebastian Wojciechowski <42519683+sebwoj@users.noreply.github.com> Seunghun Lee <waydi1@gmail.com> Shanavas M <shanavas.m2@gmail.com> Simon Charette <charettes@users.noreply.github.com> Simon Schmidt <schmidt.simon@gmail.com> srafehi <shadyrafehi@gmail.com> Steven Sklar <sklarsa@gmail.com> Tom Booth <thomasbo@microsoft.com> Tom Clancy <ClancyTJD@users.noreply.github.com> Toni Ruža <gmr.gaf@gmail.com> tothegump <tothegump@gmail.com> Victor Mireyev <victor@opennodecloud.com> Vikas Prasad <vikasprasad.prasad@gmail.com> walterqian <walter@color.com> Willem <himself@willemthiart.com> Xiaodong <xd_deng@hotmail.com> yywing <386542536@qq.com>

Примечание

Эта стена была автоматически сгенерирована из истории git, поэтому, к сожалению, она не включает людей, которые помогают в более важных вещах, таких как ответы на вопросы списка рассылки.

Обновление с Celery 4.2

Пожалуйста, прочтите важные примечания ниже, так как есть несколько серьезных изменений.

Важные замечания

Поддерживаемые версии Python

Поддерживаются следующие версии Python:

  • CPython 2.7

  • CPython 3.4

  • CPython 3.5

  • CPython 3.6

  • CPython 3.7

  • PyPy2.7 6.0 (pypy2)

  • PyPy3.5 6.0 (pypy3)

Комбу

Начиная с этого выпуска, минимальная требуемая версия - Kombu 4.4.

Новые алгоритмы сжатия

Kombu 4.3 включает несколько новых дополнительных методов сжатия:

  • LZMA (доступен из stdlib при использовании Python 3 или из backported пакета)

  • Brotli (доступен, если вы установили пакет brotli или brotlipy)

  • ZStandard (доступен при установке пакета zstandard)

К сожалению, наш текущий протокол генерирует огромную полезную нагрузку для сложных полотен.

Пока мы не перейдем на 3-ю ревизию протокола Celery в Celery 5, которая решит эту проблему, пожалуйста, используйте один из новых методов сжатия в качестве обходного пути.

Подробнее см. в разделе Компрессия.

Бильярд

Начиная с этого выпуска, минимальная требуемая версия - Billiard 3.6.

Пул работников эвентов

Теперь нам требуется eventlet>=0.24.1.

Если вы используете рабочий пул eventlet, установите Celery с помощью:

$ pip install -U celery[eventlet]

Сериализатор MessagePack

Некоторое время мы использовали устаревший пакет msgpack-python. Теперь это исправлено, так как вместо него мы используем msgpack.

Если вы в настоящее время используете сериализатор MessagePack, пожалуйста, удалите предыдущий пакет и заново установите новый, используя:

$ pip uninstall msgpack-python -y
$ pip install -U celery[msgpack]

MongoDB Result Backend

Теперь мы поддерживаем DNS seedlist connection format для бэкенда результатов MongoDB.

Для этого требуется пакет dnspython.

Если вы используете бэкенд результатов MongoDB, установите Celery с помощью:

$ pip install -U celery[mongodb]

Redis Message Broker

Из-за многочисленных ошибок в предыдущих версиях py-redis, которые вызывали проблемы с Celery, мы были вынуждены увеличить минимально необходимую версию до 3.2.0.

Бэкенд результатов Redis

Из-за многочисленных ошибок в предыдущих версиях py-redis, которые вызывали проблемы с Celery, мы были вынуждены увеличить минимально необходимую версию до 3.2.0.

Riak Result Backend

Официальный клиент Riak пока не поддерживает Python 3.7.

Если вы используете бэкенд результатов Riak, либо попытайтесь установить клиент из master, либо избегайте обновления до Python 3.7, пока этот вопрос не будет решен.

Если вы используете бэкенд результатов Riak с Python 3.7, мы теперь выдаем предупреждение.

Пожалуйста, отслеживайте basho/riak-python-client#534 для получения обновлений.

Прекращена поддержка RabbitMQ 2.x

Начиная с этого выпуска, мы официально прекращаем поддержку RabbitMQ 2.x.

Последний релиз 2.x был выпущен в 2012 году, и нам пришлось внести коррективы для корректной поддержки высокой доступности на RabbitMQ 3.x.

Если по какой-то причине вы все еще используете RabbitMQ 2.x, мы рекомендуем вам как можно скорее обновиться, поскольку исправления безопасности больше не применяются на RabbitMQ 2.x.

Поддержка Django

Начиная с этого выпуска, минимальная требуемая версия Django - 1.11.

Модернизированный сериализатор аутентификации

Сериализатор auth был полностью переработан. Ранее он был ужасно сломан.

Теперь мы зависим от cryptography вместо pyOpenSSL для этого сериализатора.

Подробнее см. в разделе Подписание сообщений.

Новости

Брокеры

Поддержка брокером Redis URIs для SSL

Брокер Redis теперь поддерживает SSL-соединения.

Вы можете использовать broker_use_ssl, как обычно, и использовать URI rediss://.

Вы также можете передать параметры конфигурации SSL в URI:

rediss://localhost:3456?ssl_keyfile=keyfile.key&ssl_certfile=certificate.crt&ssl_ca_certs=ca.pem&ssl_cert_reqs=CERT_REQUIRED.

Настраиваемые события Имя обмена

Ранее имя биржи событий было жестко задано.

Для его определения можно использовать event_exchange. Значение по умолчанию остается неизменным.

Настраиваемое имя обмена Pidbox

Ранее имя обмена Pidbox было жестко задано.

Для его определения можно использовать control_exchange. Значение по умолчанию остается неизменным.

Бэкенды результатов

Поддержка бэкендом Redis Result поддержки SSL URIs

Бэкенд результатов Redis теперь поддерживает SSL-соединения.

Вы можете использовать redis_backend_use_ssl для его настройки и использовать URI rediss://.

Вы также можете передать параметры конфигурации SSL в URI:

rediss://localhost:3456?ssl_keyfile=keyfile.key&ssl_certfile=certificate.crt&ssl_ca_certs=ca.pem&ssl_cert_reqs=CERT_REQUIRED.

Хранить расширенные метаданные задачи в результатах

Когда result_extended равно True, бэкэнд будет хранить следующие метаданные:

  • Название задачи

  • Аргументы

  • Аргументы по ключевым словам

  • Рабочий, на котором было выполнено задание

  • Количество повторных попыток

  • Имя очереди или ключ маршрутизации

Кроме того, celery.app.task.update_state() теперь принимает аргументы в виде ключевых слов, что позволяет сохранять пользовательские данные вместе с результатом.

Кодирование результатов с помощью другого сериализатора

Параметр result_accept_content позволяет настроить различное принимаемое содержимое для бэкенда результатов.

Для подписанных сообщений используется специальный сериализатор (auth), однако сериализатор результатов остается в формате json, поскольку мы не хотим иметь зашифрованное содержимое в бэкенде результатов.

Чтобы принимать неподписанное содержимое из бэкенда результатов, мы ввели этот новый параметр конфигурации для указания принимаемого содержимого из бэкенда.

Новые бэкенды результатов

В этом выпуске представлены четыре новых бэкенда результатов:

  • Бэкэнд результатов S3

  • Бэкенд результатов ArangoDB

  • Бэкэнд результатов Azure Block Blob Storage

  • Бэкэнд результатов CosmosDB

S3 Result Backend

Amazon Simple Storage Service (Amazon S3) - это служба хранения объектов от AWS.

Результаты сохраняются с использованием следующего шаблона пути:

Дополнительную информацию см. в разделе Настройки бэкенда S3.

Бэкенд результатов ArangoDB

ArangoDB - это собственная многомодельная база данных с возможностью поиска. Бэкэнд хранит результат в следующем формате документа:

{
_key: {key},
задача: {задача}
}

Дополнительную информацию см. в разделе Настройки бэкенда ArangoDB.

Azure Block Blob Storage Result Backend

Azure Block Blob Storage - это служба хранения объектов от Microsoft.

Бэкэнд сохраняет результат в следующем шаблоне пути:

Дополнительную информацию см. в разделе Настройки бэкенда Azure Block Blob.

Бэкенд результатов CosmosDB

Azure Cosmos DB - это глобально распределенная, многомодельная служба баз данных Microsoft.

Бэкэнд сохраняет результат в следующем формате документа:

{
id: {key},
значение: {задача}
}

Дополнительную информацию см. в разделе Настройки бэкенда CosmosDB (экспериментально).

Задачи

Китонизированные задачи

Теперь поддерживаются задачи на языке Cython. Вы можете генерировать C-код из Cython, который определяет задачу с помощью декоратора @task, и все будет работать точно так же.

Подтверждение заданий при сбоях или тайм-аутах

Когда task_acks_late имеет значение True, задания квитируются при сбоях или тайм-аутах. Это затрудняет использование очередей и обменов «мертвых букв».

Celery 4.3 вводит новый параметр task_acks_on_failure_or_timeout, который позволяет не подтверждать задания, если они не выполнились или завершились по таймеру, даже если task_acks_late установлен в True.

task_acks_on_failure_or_timeout по умолчанию имеет значение True.

Расписания теперь поддерживают микросекунды

При планировании задач с использованием celery beat микросекунды больше не игнорируются.

Приоритет задачи по умолчанию

Теперь вы можете установить приоритет задачи по умолчанию с помощью параметра task_default_priority. Значение настройки будет использоваться, если для конкретной задачи не указан приоритет.

Задачи по желанию наследуют приоритет родителя

Установка опции конфигурации task_inherit_parent_priority в True заставит задачи Celery наследовать приоритет предыдущей связанной с ней задачи.

Примеры:

c = celery.chain(
  add.s(2), # priority=None
  add.s(3).set(priority=5), # priority=5
  add.s(4), # priority=5
  add.s(5).set(priority=3), # priority=3
  add.s(6), # priority=3
)
@app.task(bind=True)
def child_task(self):
  pass

@app.task(bind=True)
def parent_task(self):
  child_task.delay()

# child_task will also have priority=5
parent_task.apply_async(args=[], priority=5)

Холст

Аккорды могут быть исполнены в режиме Eager Mode

Когда task_always_eager имеет значение True, аккорды также выполняются с нетерпением.

Настраиваемый тайм-аут присоединения аккорда

Ранее celery.result.GroupResult.join() имел фиксированный тайм-аут в 3 секунды.

Настройка result_chord_join_timeout теперь позволяет изменить его.

По умолчанию остается 3 секунды.

Вернуться на верх