Продвинутое использование celery — Александр Кошелев

30
Продвинутое использование Celery Александр Кошелев, Яндекс Python Party, Киев, 4 октября 2014 29

Upload: yandex

Post on 22-Apr-2015

355 views

Category:

Technology


13 download

DESCRIPTION

Доклад будет интересен как тем, кто уже знаком с библиотекой для реализации очередей задач Celery, так и тем, кто только собирается её попробовать. Основные темы выступления: - как устроена Celery; - как перейти на альтернативные брокеры; - как обеспечить эффективный доступ к ресурсам; - как отслеживать работоспособность процессов Celery

TRANSCRIPT

Page 1: Продвинутое использование Celery — Александр Кошелев

Продвинутоеиспользование

Celery

Александр Кошелев, Яндекс

Python Party, Киев, 4 октября 201429

Page 2: Продвинутое использование Celery — Александр Кошелев

СодержаниеОбщее описание – что такое CeleryИспользование MongoDB и Redis в качествеброкераНесколько приложений Celery в одном проектеЭксклюзивный доступ к ресурсамЛогирование ошибокМониторинг Celery

Page 3: Продвинутое использование Celery — Александр Кошелев

Что такое CeleryДля пользователя

"Distributed task queue"Асинхронные задачиЗадачи по расписанию

Page 4: Продвинутое использование Celery — Александр Кошелев

Что такое CeleryДля пользователя

Задачи ставятся в очереди клиентамиОчереди хранит брокерОчереди разбираются воркерамиЗадачи возвращают результатыВоркеры создают события

Page 5: Продвинутое использование Celery — Александр Кошелев

Что такое CeleryДля разработчика

Kombu + абстракция над "задачей"Kombu

"Messaging library"Несколько транспортов для сообщенийAMQP или "virtual AMQP"

Page 6: Продвинутое использование Celery — Александр Кошелев

Что такое CeleryДля админа

Воркеры (1..N)Мастер-процесс (1)Процессы выполняющие задачи (1..N)

Воркер слушает очереди (1..N) у брокераОсобый воркер - celery beat

Имеет расписаниеСтавит задачи в очередиСохраняет своё состояние

Брокер - транспорт между клиентом и воркерами

Page 7: Продвинутое использование Celery — Александр Кошелев

Альтернативныеброкеры

Нет дополнительной сущностиЛучше подходят под задачу

Page 8: Продвинутое использование Celery — Александр Кошелев

Альтернативныеброкеры

Virtual AMQP

Эмуляция AMQPЕсть не все возможностиБольше кода, который может сломатьсяПотенциально меньшая эффективность

Page 9: Продвинутое использование Celery — Александр Кошелев

Альтернативныеброкеры

Redis

Работает через virtual AMQPБыстрыйВстроенный LRU механизм

Page 10: Продвинутое использование Celery — Александр Кошелев

Альтернативныеброкеры

MongoDB

Работает через virtual AMQPFailover через Replica SetЭкспериментальный статусНе работают события

Page 11: Продвинутое использование Celery — Александр Кошелев

Несколько приложенийЧто такое "приложение"

Набор настроекЗарегистрированные задачиВсегда есть хотя бы одно

Page 12: Продвинутое использование Celery — Александр Кошелев

Несколько приложенийРазные брокеры

Разный профиль нагрузкиРазный тип задач

Page 13: Продвинутое использование Celery — Александр Кошелев

Несколько приложенийИспользование

from celery import Celery

app_global = Celery()app_global.conf.update(BROKER_URL='mongodb://')

app_local = Celery()app_local.conf.update(BROKER_URL='redis://')

app_global.set_current()task_a.apply_async()

app_local.set_current()task_b.apply_async()

Page 14: Продвинутое использование Celery — Александр Кошелев

Блокировки ресурсовОграниченная пропускная способностьЭксклюзивный доступЗапуск одной задачи за раз

Page 15: Продвинутое использование Celery — Александр Кошелев

Блокировки ресурсовИнтеграция

Декоратор

Базовый класс

Внутри beat шедулера

@task@locked('lock-name')def my_task(): ...

class MyTask(LockedTask): def locked_run(self): ...

Page 16: Продвинутое использование Celery — Александр Кошелев

Блокировки ресурсовИнструмент

ZooKeeper (kazoo)etcd...MongoDB

Page 17: Продвинутое использование Celery — Александр Кошелев

Блокировки ресурсовSemaphore

Нужно ограничить нагрузку на компонентУ компонента есть емкость - кол-во тикетовЕсли тикеты кончились - обратно в очередь

Page 18: Продвинутое использование Celery — Александр Кошелев

Блокировки ресурсовSemaphore

zk = KazooClient()

def locked(name, capacity): def _decorator(func): def _wrapper(self, *args, **kwargs): semaphore = zk.Semaphore('/path', name, capacity)

if semaphore.acquire(blocking=False): try: return func(self, *args, **kwargs) finally: semaphore.release() else: raise self.retry(coundown=5)

return _wrapper return _decorator

Page 19: Продвинутое использование Celery — Александр Кошелев

Блокировки ресурсовSemaphore

@task(bind=True)@locked('save-to-storage-task', 10)def save_to_storage(self, data): storage.save(data)

Page 20: Продвинутое использование Celery — Александр Кошелев

Блокировки ресурсовMutex

Эксклюзивный доступЕсли лок у кого-то другого - обратно в очередь

Page 21: Продвинутое использование Celery — Александр Кошелев

Блокировки ресурсовMutex

from celery import Task

class LockedTask(Task): lock_name = None retry_on_lock = True

def run(self, *args, **kwargs): lock = zk.Lock('/path', self.lock_name)

if lock.acquired(blocking=False): try: return self.locked_run(*args, **kwargs) finally: lock.release() elif self.retry_on_lock: raise self.rerty(countdown=5)

def locked_run(self): raise NotImplementedError

Page 22: Продвинутое использование Celery — Александр Кошелев

Блокировки ресурсовMutex

class ImportDataTask(LockedTask): name = 'import-data' retry_on_lock = False

def locked_run(self, url): response = requests.get(url)

...

Page 23: Продвинутое использование Celery — Александр Кошелев

Логирование ошибокВарианты

Воркер пишет ошибки в консоль или файлНастройка логинга в обработчике сигналаНастройка логинга в проекте

Page 24: Продвинутое использование Celery — Александр Кошелев

Логирование ошибокНастройка

import logging

from celery.signals import setup_logging

@setup_logging.connectdef setup_worker_logging(loglevel, logfile, format, colorize): root = logging.getLogger() root.setLevel(loglevel) root.addHandler(logging.handlers.SysLogHandler())

Page 25: Продвинутое использование Celery — Александр Кошелев

Логирование ошибокАналитика

Page 26: Продвинутое использование Celery — Александр Кошелев

МониторингПолучение текущего состояния воркера

celery inspect pingcelery inspect activecelery inspect stats

Подписка на события воркераcelery eventscelery flower

Page 27: Продвинутое использование Celery — Александр Кошелев

Мониторингcelery inspect

user@host:~$ celery inspect ping-> default@host01: OK pong-> management@host01: OK pong-> swarm@host02: OK pong-> swarm_check@host02: OK pong-> swarm_push@host03: OK pong-> swarm_store@host03: OK pong-> swarm_walk@host04: OK pong

Page 28: Продвинутое использование Celery — Александр Кошелев

МониторингFlower

Page 29: Продвинутое использование Celery — Александр Кошелев

МониторингЧто выбрать

celery inspect - текущий мониторингcelery flower - глубокая отладка и медитация

Page 30: Продвинутое использование Celery — Александр Кошелев

Вопросы?

[email protected]

github.com/daevaorn