Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

Alexander Koshelev

October 04, 2014
Tweet

More Decks by Alexander Koshelev

Other Decks in Programming

Transcript

  1. Содержание Общее описание – что такое Celery Использование MongoDB и

    Redis в качестве брокера Несколько приложений Celery в одном проекте Эксклюзивный доступ к ресурсам Логирование ошибок Мониторинг Celery
  2. Что такое Celery Для пользователя Задачи ставятся в очереди клиентами

    Очереди хранит брокер Очереди разбираются воркерами Задачи возвращают результаты Воркеры создают события
  3. Что такое Celery Для разработчика Kombu + абстракция над "задачей"

    Kombu "Messaging library" Несколько транспортов для сообщений AMQP или "virtual AMQP"
  4. Что такое Celery Для админа Воркеры (1..N) Мастер-процесс (1) Процессы

    выполняющие задачи (1..N) Воркер слушает очереди (1..N) у брокера Особый воркер - celery beat Имеет расписание Ставит задачи в очереди Сохраняет своё состояние Брокер - транспорт между клиентом и воркерами
  5. Альтернативные брокеры Virtual AMQP Эмуляция AMQP Есть не все возможности

    Больше кода, который может сломаться Потенциально меньшая эффективность
  6. Альтернативные брокеры MongoDB Работает через virtual AMQP Failover через Replica

    Set Экспериментальный статус Не работают события
  7. Несколько приложений Использование f r o m c e l

    e r y i m p o r t C e l e r y a p p _ g l o b a l = C e l e r y ( ) a p p _ g l o b a l . c o n f . u p d a t e ( B R O K E R _ U R L = ' m o n g o d b : / / ' ) a p p _ l o c a l = C e l e r y ( ) a p p _ l o c a l . c o n f . u p d a t e ( B R O K E R _ U R L = ' r e d i s : / / ' ) a p p _ g l o b a l . s e t _ c u r r e n t ( ) t a s k _ a . a p p l y _ a s y n c ( ) a p p _ l o c a l . s e t _ c u r r e n t ( ) t a s k _ b . a p p l y _ a s y n c ( )
  8. Блокировки ресурсов Интеграция Декоратор Базовый класс Внутри beat шедулера @

    t a s k @ l o c k e d ( ' l o c k - n a m e ' ) d e f m y _ t a s k ( ) : . . . c l a s s M y T a s k ( L o c k e d T a s k ) : d e f l o c k e d _ r u n ( s e l f ) : . . .
  9. Блокировки ресурсов Semaphore Нужно ограничить нагрузку на компонент У компонента

    есть емкость - кол-во тикетов Если тикеты кончились - обратно в очередь
  10. Блокировки ресурсов Semaphore z k = K a z o

    o C l i e n t ( ) d e f l o c k e d ( n a m e , c a p a c i t y ) : d e f _ d e c o r a t o r ( f u n c ) : d e f _ w r a p p e r ( s e l f , * a r g s , * * k w a r g s ) : s e m a p h o r e = z k . S e m a p h o r e ( ' / p a t h ' , n a m e , c a p a c i t y ) i f s e m a p h o r e . a c q u i r e ( b l o c k i n g = F a l s e ) : t r y : r e t u r n f u n c ( s e l f , * a r g s , * * k w a r g s ) f i n a l l y : s e m a p h o r e . r e l e a s e ( ) e l s e : r a i s e s e l f . r e t r y ( c o u n d o w n = 5 ) r e t u r n _ w r a p p e r r e t u r n _ d e c o r a t o r
  11. Блокировки ресурсов Semaphore @ t a s k ( b

    i n d = T r u e ) @ l o c k e d ( ' s a v e - t o - s t o r a g e - t a s k ' , 1 0 ) d e f s a v e _ t o _ s t o r a g e ( s e l f , d a t a ) : s t o r a g e . s a v e ( d a t a )
  12. Блокировки ресурсов Mutex f r o m c e l

    e r y i m p o r t T a s k c l a s s L o c k e d T a s k ( T a s k ) : l o c k _ n a m e = N o n e r e t r y _ o n _ l o c k = T r u e d e f r u n ( s e l f , * a r g s , * * k w a r g s ) : l o c k = z k . L o c k ( ' / p a t h ' , s e l f . l o c k _ n a m e ) i f l o c k . a c q u i r e d ( b l o c k i n g = F a l s e ) : t r y : r e t u r n s e l f . l o c k e d _ r u n ( * a r g s , * * k w a r g s ) f i n a l l y : l o c k . r e l e a s e ( ) e l i f s e l f . r e t r y _ o n _ l o c k : r a i s e s e l f . r e r t y ( c o u n t d o w n = 5 ) d e f l o c k e d _ r u n ( s e l f ) : r a i s e N o t I m p l e m e n t e d E r r o r
  13. Блокировки ресурсов Mutex c l a s s I m

    p o r t D a t a T a s k ( L o c k e d T a s k ) : n a m e = ' i m p o r t - d a t a ' r e t r y _ o n _ l o c k = F a l s e d e f l o c k e d _ r u n ( s e l f , u r l ) : r e s p o n s e = r e q u e s t s . g e t ( u r l ) . . .
  14. Логирование ошибок Варианты Воркер пишет ошибки в консоль или файл

    Настройка логинга в обработчике сигнала Настройка логинга в проекте
  15. Логирование ошибок Настройка i m p o r t l

    o g g i n g f r o m c e l e r y . s i g n a l s i m p o r t s e t u p _ l o g g i n g @ s e t u p _ l o g g i n g . c o n n e c t d e f s e t u p _ w o r k e r _ l o g g i n g ( l o g l e v e l , l o g f i l e , f o r m a t , c o l o r i z e ) : r o o t = l o g g i n g . g e t L o g g e r ( ) r o o t . s e t L e v e l ( l o g l e v e l ) r o o t . a d d H a n d l e r ( l o g g i n g . h a n d l e r s . S y s L o g H a n d l e r ( ) )
  16. Мониторинг Получение текущего состояния воркера celery inspect ping celery inspect

    active celery inspect stats Подписка на события воркера celery events celery flower
  17. Мониторинг celery inspect u s e r @ h o

    s t : ~ $ c e l e r y i n s p e c t p i n g - > d e f a u l t @ h o s t 0 1 : O K p o n g - > m a n a g e m e n t @ h o s t 0 1 : O K p o n g - > s w a r m @ h o s t 0 2 : O K p o n g - > s w a r m _ c h e c k @ h o s t 0 2 : O K p o n g - > s w a r m _ p u s h @ h o s t 0 3 : O K p o n g - > s w a r m _ s t o r e @ h o s t 0 3 : O K p o n g - > s w a r m _ w a l k @ h o s t 0 4 : O K p o n g