• Главная
  • Контакты
Подписаться:
  • Twitter
  • Facebook
  • RSS
  • VK
  • PushAll
logo

logo

  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • За год
    • Положительные
    • Отрицательные
  • Сортировка
    • По дате (возр)
    • По дате (убыв)
    • По рейтингу (возр)
    • По рейтингу (убыв)
    • По комментам (возр)
    • По комментам (убыв)
    • По просмотрам (возр)
    • По просмотрам (убыв)
Главная
  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • Главная
  • The uWSGI Spooler

The uWSGI Spooler +26

24.04.2017 08:30
VyacheslavAkhmetov 4 3300 Источник
Python*, Блог компании Селектел


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


Самой популярной системой очередей в Python является Celery, она обладает широким набором возможностей по управлению задачами. К сожалению, системы на базе Celery сложно поддерживать в работоспособном состоянии, и когда что-то идёт не так, то найти проблему бывает весьма не просто. Можете спросить любого девопса об опыте работы с Celery, но будьте готовы услышать не очень приятные слова.


К счастью, есть альтернативное решение — uWSGI Spooler, и в этой статье я расскажу о нём подробнее.



Основным отличием от Celery является то, что не нужно использовать дополнительные компоненты (сам Celery и хранилище, например Redis), таким образом количество точек отказа уменьшается на две. В качестве хранилища задач может использоваться директория, внешняя директория или сетевой пул.


Для управления Python программами мы часто используем uWSGI. Почему? Потому что он прост в настройке, надежен, гибок и выполняет большинство требований.


Кроме обслуживания Python-кода в виде обеспечения непрерывного доступа к web-приложению, в uWSGI входит компонент Spooler, который реализует систему очередей. Spooler имеет некоторые особенности, а документация по нему достаточно скудна.


Использовать uWSGI Spooler просто, как раз-два-три! Но есть несколько нюансов.
Модуль uwsgi нельзя импортировать из кода, а соответственно тестировать из консоли код не получится, необходимо каждый раз запускать uwsgi воркера, для чего необходимо создать конфиг:


[uwsgi]
socket = /var/run/mysite.sock 
master = True
processes = 4
project_dir = /home/myuser/mysite
chdir = %(project_dir)
spooler = /var/uwsgi_spools/mysite_spool
spooler-import = path.to.spool.package # (package to import spool file)
spooler-frequency = 10 # Frequency for scanning spool
max-requests = 5000
module = wsgi:application
touch-reload = wsgi.py

Файл воркера:


from uwsgidecorators import spool, uwsgi

@spool
def my_func(args):
    print(args)
    # do some job

Постановка задачи из вашего кода:


import uwsgi_spools.mysite_spool as mysite_spool

mysite_spool.my_func.spool(test=True)

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


Внутри таска доступен один аргумент, который содержит словарь с тремя служебными ключами (имя функции ud_spool_func, имя таска spooler_task_name, статус таска ud_spool_ret) и всеми параметрами, что были переданы при создании таска, в примере это ключ test.


Таск может вернуть три статуса:


  • -2 (SPOOL_OK) – таск выполнен, будет удалён из очереди;
  • -1 (SPOOL_RETRY) – что-то пошло не так, таск будет повторно вызван;
  • 0 (SPOOL_IGNORE) – игнорировать таск.

Все прочие значения будут интерпретированы как -1 (SPOOL_RETRY).


Особенность: декоратор @spool выполняется единожды (возвращает SPOOL_OK), если функция не упала с исключением.
Для того чтобы управлять жизненным циклом нужно использовать @spoolraw.


Особые ключи (вспомогательные) при создании таска:


  • spooler — абсолютный путь к спулеру, который будет выполнять задачу;
  • at — unix time, когда задача должна быть выполнена (правильнее сказать, она не будет выполнена ранее этого значения);
  • priority — указывает на подпапку в папке задач (на такую подпапку можно выделить большее количество воркеров), через --spooler-ordered можно настроить приоритеты;
  • body — этот ключ используется для значений более 64 КБ, в задачу будет доступен в сериализованном виде.

Кроме декоратора @spool доступен декоратор @timer, который принимает количество секунд в качестве аргумента и позволяет выполнять декорируемую функцию с указанным интервалом.


@timer(30)
def my_func(args):
    print(args)
    # do some job every 30 sec

Аналогично @timer есть декоратор @spoolforever, который будет повторно запускать выполнение функции (завершение задачи со статусом SPOOL_RETRY).


@spoolforever
def my_func(args):
    print(args)
    # do some job and repeat

Для настройки воркеров для работы по сети, нужно добавить адрес, по которому он будет доступен в ini-файл:


socket = 127.0.0.1:10001

При создании задачи указывать адрес получателя задачи:


uwsgi.send_message(“127.0.0.1:10001”, 17, 0, test=True, 5)
# или
uwsgi.spool(test=True, spooler=“127.0.0.1:10001”)

Таким образом, uWSGI Spooler можно использовать как замену очередям, но если всё же не хватает возможностей или хочется немного сахара, то можно использовать uwsgi-tasks, который реализует недостающее.

Поделиться с друзьями
-->

Комментарии (4)


  1. crazylh
    24.04.2017 20:20
    #10189156
    +1

    >К сожалению, системы на базе Celery сложно поддерживать в работоспособном состоянии, и когда что-то идёт не так, то найти проблему бывает весьма не просто.

    А вы уверены, что говорите именно про проблемы продукта, а не очереди, поверх которой бежит Celery (rabbitmq/redis/mongo)


    1. rusnasonov
      27.04.2017 11:15
      #10193584

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


  1. Satevg
    24.04.2017 21:33
    #10189264

    но если всё же не хватает возможностей


    Из статьи создается ощущение того, что все с Spooler «ровно-гладко, замените Celery, захочете еще»,
    И все же какие есть различия с Celery кроме описанных выше, нюансы в продакшене?


  1. foldr
    27.04.2017 11:15
    #10193590

    А можно по-подробнее, о каких проблемах с Celery идет речь? Сам участвую в проекте с Celery не так давно, но пока не возникало желания его выкинуть и заменить на что-то другое

МЕТКИ

  • Хабы
  • Теги

Python

Блог компании Селектел

spooler

uWSGI

система очередей

СЕРВИСЫ
  • logo

    CloudLogs.ru - Облачное логирование

    • Храните логи вашего сервиса или приложения в облаке. Удобно просматривайте и анализируйте их.
Все публикации автора
  • The uWSGI Spooler +26

    • 24.04.2017 08:30

    Vscale: облачные серверы +25

    • 17.08.2015 10:48

Подписка


ЛУЧШЕЕ

  • Сегодня
  • Вчера
  • Позавчера
13:01

Про свёрла +102

09:01

Автоматический светодиод +34

13:02

Прощание с доступной Windows: Microsoft хоронит SE-версию и уступает нишу конкурентам +13

08:12

Теорема о разделяющей оси при обнаружениях столкновений +13

15:50

Идеальное опровержение Эйнштейна +10

08:20

IOCCC: Best of Show 2018 +10

07:43

Фрактальная монотипия +10

07:06

Наглядное пособие начинающего ретрогеймера. С чего начать путь в мир старых шедевров +10

08:47

О прионах и дизайне белков +9

15:45

Почему Европа не смогла сделать свою Кремниевую долину +7

14:52

Учим LM Studio ходить в интернет при ответах на вопросы +6

12:09

По пакету всему свету. Изучаем пакеты в Arch Linux +5

11:45

Грабли, которые я собрал на пути в геймдеве и чему они меня научили +5

08:00

Как ходоки получают разряды: обсуждаем соревнования по Nordic Walking +5

06:15

Контентный модуль APM на OpenTelemetry — архитектура, метрики, выводы +5

15:15

Секреты сильной команды +3

18:53

Десять игр, в которые должен поиграть каждый геймдизайнер +2

17:31

Выбор стратегии компактизации в ScyllaDB +2

14:16

Альтернативный способ хранения скриншотов в Playwright и способ их обновления +2

13:16

Скетч системного дизайна: как одна схема решает множество проблем на старте проекта +2

20:59

История о том, как я вытащил себя из бесконечной ленты и стал успевать все +68

00:01

Взаимодействие микросервисов: проблемы, решения, практические рекомендации +55

09:01

Мемы админов и про админов. Часть 2: для чего одмину бубен? +47

13:01

Нерешённые вопросы о происхождении жизни +41

16:24

Throw — это новый goto +28

10:29

Шикарные портативные консоли лета 2025 года: новинки карманного гейминга +26

10:10

Изучаем Go: руководство для JavaScript-разработчиков. Часть 1 +23

09:44

Небольшое ретро-программинг приключение, или как я снова полюбил кодить +22

16:10

Как писать промт для генерации изображения/видео и получить лучший результат? +19

08:00

10 лет Windows 10: почему «десятка» живет дольше, чем планировалось +17

07:00

Покажи свой стартап/пет-проект (август) +14

11:15

Почему LLM не мыслят как люди +12

20:45

Об индексах на столбцах с низкой кардинальностью +9

14:02

Больше 40 товарных знаков: как создатели Atomic Heart защитили свою игру в России +9

22:11

Худеть по науке и без мазохизма +6

09:18

Защита от дурака в Gemini 2.5 Deep Think +6

05:56

Как захватить Вселенную за AGE (Часть 1) +6

15:36

Операционка как пет-проект — подборка «экспериментов» +5

19:46

Что такое ИДЕЯ с точки зрения геймдизайна, сколько она на самом деле стоит, и как генерится +4

19:40

То, что должно успокаивать – заставляет бояться. ГАМК, астроциты и ПТСР +4

13:01

Как я от нечего делать замедлил Postgres в 42 000 раз +64

09:01

Самодельные французские радиолампы 1920 г. Часть 3. Разрядная трубка, лампа накаливания +58

08:10

Физика ошибок не прощает. Она догонит тебя на крыше и заставит платить (дважды) +50

18:45

Как выйти из IT?.. и пойти слесарем на завод. Моя попыточка дауншифтинга [4\5] +38

17:07

Кому нужна математика? +35

08:32

Выделенные серверы + Kubernetes: практическое руководство +32

07:00

HTC Desire HD: история, дизайн и возможности легендарного смартфона +30

08:05

Домофон Лидер-М. Как скрестить трубку с ключом и всем проиграть +29

10:17

Моё мини-исследование про продолжительность жизни в России +25

10:21

«Плохие парни работают просто»: пентестеры разбирают реальные кейсы +24

13:40

Промт для изучения чего угодно: протокол Олега-Деминга +21

07:40

Как мы ускорили проверку документации с помощью AI-агента: от боли к решению +19

04:52

DNS-хаос, зомби-поды и майнеры в кластере: самые невероятные случаи при работе с Kubernetes +19

18:34

Plata — как выходцы из «Тинькофф» строят банк-единорог в Мексике +18

08:42

Ставим шину AHB-Lite на ядро YRV +17

06:00

Как учить английский по сериалам и не бросить на второй серии +16

09:00

Как не потерять миллионы на SLA: архитектурный подход к управлению ожиданиями +15

15:02

Барьеры памяти «Golang» +14

14:10

История игровой журналистики в России. Часть 4: Журнал «Великий Dракон» +14

08:22

Ближайшая суперземля K2-18 b может быть океанической планетой +14

ОБСУЖДАЕМОЕ

  • 10 лет Windows 10: почему «десятка» живет дольше, чем планировалось +17

    • 251   13000

    Как превратить ноутбук в полноценное рабочее место не хуже стационарного ПК +3

    • 220   34000

    Throw — это новый goto +28

    • 114   21000

    Моё мини-исследование про продолжительность жизни в России +25

    • 98   18000

    Шикарные портативные консоли лета 2025 года: новинки карманного гейминга +26

    • 82   9600

    Нерешённые вопросы о происхождении жизни +41

    • 57   14000

    Взаимодействие микросервисов: проблемы, решения, практические рекомендации +55

    • 55   9300

    Почему LLM не мыслят как люди +12

    • 53   3100

    Про свёрла +102

    • 52   7900

    Наше общение нам больше не принадлежит. Размышляю как ИИ создаст альтернативу для Telegram без VPN и прослушки +4

    • 51   6800

    IoT по-взрослому — сбор данных с датчиков для Умного дома на одноплатнике Repka Pi 4 под управлением NapiLinux +7

    • 43   3500

    История о том, как я вытащил себя из бесконечной ленты и стал успевать все +68

    • 40   24000

    Как выйти из IT?.. и пойти слесарем на завод. Моя попыточка дауншифтинга [4\5] +38

    • 35   16000

    Как научиться играть в стратегии Total War: ультимативный гайд для новичков в серии +1

    • 30   12000

    Физика ошибок не прощает. Она догонит тебя на крыше и заставит платить (дважды) +50

    • 30   12000
  • Главная
  • Контакты
© 2025. Все публикации принадлежат авторам.