Перейти к содержимому

Queuety

Механизм рабочих процессов WordPress.

Терминал
wp plugin install https://github.com/inline0/queuety/releases/latest/download/queuety.zip --activate

Последний выпуск v0.22.0 GPL-2.0-or-later WordPress 6.4+, PHP 8.2+

На практике

Рабочий процесс, заданный в PHP, и команда исполнителя, которая его запускает.

Рабочий процесс с подтверждением

Рабочий процесс выполняет шаг, ждёт 24 часа, затем приостанавливается на wait_for_approval() до тех пор, пока другой процесс не отправит сигнал approval.

Задержка хранится в базе данных, поэтому она сохраняется после перезапуска исполнителя и развёртывания обновлений, а сигнал, отправленный заранее, записывается и обрабатывается, когда рабочий процесс доходит до ожидания. При отмене запуска вызывается обработчик on_cancel().

PHP
$workflow_id = Queuety::workflow( 'approval_flow' )
    ->then( SubmitRequestHandler::class )
    ->delay( hours: 24 )
    ->wait_for_approval()
    ->then( ProcessApprovalHandler::class )
    ->on_cancel( CleanupHandler::class )
    ->dispatch( [ 'request_id' => 99 ] );

// Later, from another process:
Queuety::signal( $workflow_id, 'approval', [ 'approved_by' => 'admin@example.com' ] );

Прямое получение MySQL

Каждый исполнитель работает в длительно работающем процессе WP-CLI и получает задачи напрямую из MySQL с помощью FOR UPDATE SKIP LOCKED.

Надёжные рабочие процессы

Многоэтапные процессы с постоянным состоянием, переживающим тайм-ауты PHP, сбои и повторные запуски.

Конечные автоматы

Длительно живущее состояние, управляемое событиями, с Queuety::machine(): определяйте состояния и переходы, отправляйте события, просматривайте хронологию.

Сигналы и подтверждения

wait_for_signal(), wait_for_approval() и wait_for_input() приостанавливают рабочий процесс до поступления внешнего ввода.

Уровни приоритета

Четыре уровня: от низкого до срочного. В очереди задачи с более высоким приоритетом берутся первыми.

Ограничение частоты запросов

Лимиты для каждого обработчика в скользящем окне. Исполнитель, получивший задачу с ограничением частоты, возвращает её в очередь и ждёт.

Повторяющиеся задачи

Расписание по интервалу и на основе cron. Встроенный анализатор cron без внешних зависимостей.

Параллельные шаги

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

Метрики и журналы

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

Резервный режим WP-Cron

Без доступа к оболочке событие WordPress cron, запускаемое раз в минуту, выполняет одноразовый исполнитель для очереди по умолчанию.

Промежуточное ПО

Промежуточное ПО задач в стиле «луковицы» для ограничения частоты, регулирования исключений, обеспечения уникальности, тайм-аутов и защиты от параллельного выполнения.

PHP 8.2+

Перечисления, классы только для чтения, выражения match, продвижение свойств конструктора и атрибуты PHP.

Почему Queuety

Состояние хранится в MySQL

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

Вне запроса страницы

WP-Cron запускается только при посещении страницы, а 60-секундный вызов LLM завершается из-за 30-секундного тайм-аута PHP. Исполнители Queuety работают в длительно работающем процессе WP-CLI и принимают задачи без ожидания трафика.

Ограничения для запусков агента

for_each() с режимом кворума, этапами подтверждения и ограничениями, такими как max_transitions() и max_state_bytes(), удерживает длительные запуски агента в заданных пределах.

Можно использовать вне WordPress

Ядро с базой данных работает в любом процессе PHP, который может подключиться к той же базе данных, поэтому другое приложение может отправлять задачи, сигналы и запрашивать состояние рабочих процессов. Для триггеров действий, моста WP-Cron и команд WP-CLI всё ещё нужен WordPress.

Сравнение с

Как Queuety соотносится с планировщиками и механизмами рабочих процессов, уже знакомыми разработчикам WordPress.

Queuety в сравнении с другими инструментами
WP-Cron Подходит дляВстроен в WordPress, не требует доступа к системному планировщику на общем хостинге, а задача, пропущенная по времени, запускается при следующей загрузке страницы, а не теряется. Отличия от QueuetyИсполнители Queuety работают независимо от трафика сайта и требуют длительно работающего процесса wp queuety work. Мост WP-Cron преобразует повторяющиеся события в расписания, но пока не запускает их хуки, поэтому за ними продолжает следить WP-Cron.
Action Scheduler Подходит дляСоздан для распространения в составе плагинов и тем без доступа к серверу; ежемесячно обрабатывает миллионы платежей для Subscriptions и вебхуков для WooCommerce, а все действия записывает в интерфейс администратора. Отличия от QueuetyAction Scheduler запускает хук позднее, например с отложенным do_action(). Queuety добавляет многоэтапные рабочие процессы с состоянием, сохраняющимся между шагами, ожиданием сигналов и подтверждений, а также конечные автоматы. Их можно просматривать с помощью команд WP-CLI, например wp queuety workflow timeline.
Temporal Подходит дляПлатформа надёжного выполнения: журнал событий фиксирует каждый шаг рабочего процесса, поэтому после сбоя или перебоя запуск продолжается с последнего записанного события; также предлагается Temporal Cloud как альтернатива самостоятельному размещению службы. Отличия от QueuetyСлужба Temporal — это сервер на Go и база данных, работающие рядом с вашим приложением. Queuety хранит состояние в таблицах MySQL через подключение к базе данных WordPress и запускает исполнителей с помощью WP-CLI.

Вопросы и ответы

Краткие ответы из документации Queuety.

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