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

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

Подписка


ЛУЧШЕЕ

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

MLечный путь 2025 — знания, опыт, коммьюнити. Как это было? +37

13:01

Веб-разработка на ванильном HTML, CSS и JavaScript +34

13:00

Как мы под Новый Год загрузили в PostgreSQL петабайт данных и что из этого вышло +28

06:00

Сделали copilot-сервис для техподдержки и делимся секретами RAG c глубоким пониманием контекста +27

06:00

Альтернативы свинцовому аккумулятору ИБП +24

13:36

Разбираем древо ArangoDB «по веточкам». Подробный гайд по графовой БД +23

09:01

Jellyfin Web на своём сервере. Фронтенд для медиастриминга +23

07:00

Автоматизация трехуровневой квартиры: хочу лучше, чем в Дубае +21

15:01

Как отстроить гитару — акустическую или электро +20

10:51

За полчаса установил DeepSeek 1.5B, пока вы искали GPT подешевле +20

07:18

Этот крошечный винт отвечает за будущее гуманоидных роботов +19

08:00

Распределённый инференс и шардирование LLM. Часть 2: скрипт vLLM, Ray Serve для вывода API и настройка KubeRay Cluster +18

09:00

Terraform уже не тот? Как Pulumi меняет правила игры в Infrastructure as Code +17

09:00

Terraform уже не тот? Как Pulumi меняет правила игры в Infrastructure as Code +17

08:07

IQ — во многом псевдонаучный обман +15

13:31

Add-on pack из 90-х: Microsoft 95 Plus! для Windows +14

13:16

Как декомпозиция повышает точность распознавания текста: опыт с фотографиями СТС +14

10:46

Ортодоксальный косплеер решает задачу Перельмана про демографию, проезжая мимо Вудстока +14

08:05

Объяснение графических процессоров для тех, кто привык работать с ЦП +14

07:03

Как мы внедряем ALD Pro: подробный обзор решения, кейсы и лайфхаки для крупных ИТ-инфраструктур +14

05:26

One-shot промптинг. Как я начал вайбкодить в 10? раз быстрее +91

08:05

Самодельная паяльная станция с цифровой индикацией температуры на жесткой логике +65

13:00

Массовые увольнения в российском IT: что на самом деле происходит в компаниях — взгляд CEO +50

08:34

Лабиринты текста как игровая механика, или как неэкранизируемая литература становится источником геймдизайна +46

08:00

Всё везде и сразу +46

13:01

Введение в RawTherapee +38

06:54

Picodata: вторая жизнь in-memory баз данных +36

05:15

Как я разработал расширение для браузера за 3 дня — и получил первого платного пользователя уже на следующий день +31

09:34

Криптография эпохи Ренессанса: классика не стареет +28

07:58

Я нашёл огромную дыру в дейтинг-приложении, а разработчики попытались её скрыть +28

14:45

Переходим от legacy к построению Feature Store +27

09:01

ЦОД 2050: три реалистичные концепции развития дата-центров +26

14:12

Как я сменил лопату на клавиатуру: мой путь в IT после 30 +22

10:57

Вселенная дистрибутивов Linux: От Ubuntu до Arch, от Mint до Fedora – подробный гид по выбору +20

09:18

Распродажа в издательстве «Питер» +20

07:01

Финансовый учет: всё и немного больше про проводки +19

07:00

LLM as a Judge: опыт оптимизации генератора описаний Pull Request +18

06:09

Left Shift Testing: как выстроить процесс, чтобы тесты реально помогали +18

11:41

Зрение и его коррекция — не то, чем кажется +16

14:40

Новая генеративная модель Kandinsky 3D для создания 3D-объектов. Как она работает и кому будет полезна +15

14:22

Ещё 10 ошибок авторов Хабра +147

14:15

Мое производство электрощитов приносит 40 млн в год. Спасибо нейросетям и СССР за конструкторскую школу +82

07:43

Больше нет входа в IT. Только выход +76

08:35

Распределённый инференс и шардирование LLM. Часть 1: настройка GPU, проброс в Proxmox и настройка Kubernetes +50

05:16

Дело о Транзитроне — или Ламповый тьюториал для любопытных +50

08:01

Трамплин в интернет: как мы ускорили запуск Яндекс Браузера +44

13:06

Введение в Angie: краткая история и отличия от Nginx +43

03:22

Как за один вечер создать репутацию вашего стартапа в поисковой выдаче: 20 бесплатных площадок для быстрого буста +40

07:00

DevOps без боли: 8 инструментов для мониторинга, автоматизации и стабильной работы команд +36

10:09

Как настраивать сети: готовые решения Selectel для максимальной отказоустойчивости +35

16:15

Как я написал эмулятор Nintendo Gameboy на C++ за две недели +34

06:53

Важное обновление BatteryTest 2 +34

13:01

Как создавались вокальные эффекты Daft Punk +33

12:00

Story Points не работают? И другие мифы про оценку задач, в которые мы почему-то верим +33

09:01

Почему из технологий делают культы +29

04:53

Баффет наконец накопил достаточно для выхода на пенсию, а в OpenAI выкатили новый хитрый план +28

10:26

От релиз-менеджера до разработчика: почему я ушел из QA и не жалею +26

15:16

Бирюзовые компании в РФ: как не посинеть в найме +25

12:08

Эффект душа: почему отдых и переключение на хобби помогают принимать крутые решения +24

08:57

Разбор полётов: что умеет отечественная СХД Аэродиск AQ440 +24

ОБСУЖДАЕМОЕ

  • Больше нет входа в IT. Только выход +76

    • 587   135000

    Массовые увольнения в российском IT: что на самом деле происходит в компаниях — взгляд CEO +50

    • 415   87000

    Мое производство электрощитов приносит 40 млн в год. Спасибо нейросетям и СССР за конструкторскую школу +82

    • 216   78000

    Ещё 10 ошибок авторов Хабра +147

    • 137   7800

    Личный VPN: юзер ликует, VLESS смеётся, а РКН плачет -11

    • 108   56000

    ООП или не ООП — вот в чём ревью +4

    • 75   1700

    Альтернативы свинцовому аккумулятору ИБП +24

    • 73   6200

    Самодельная паяльная станция с цифровой индикацией температуры на жесткой логике +65

    • 63   6000

    Дело о Транзитроне — или Ламповый тьюториал для любопытных +50

    • 63   5000

    Интервью про ИИ, которое меня выбесило +14

    • 61   4500

    One-shot промптинг. Как я начал вайбкодить в 10? раз быстрее +91

    • 61   25000

    Шесть лет на диване: мои выводы об удалённой работе +1

    • 55   23000

    Бирюзовые компании в РФ: как не посинеть в найме +25

    • 50   53000

    Трамплин в интернет: как мы ускорили запуск Яндекс Браузера +44

    • 48   4300

    Быстрый алгоритм fulltext-поиска без токенизации +15

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