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+
use Queuety\Queuety;
Queuety::register( 'send_email', SendEmailHandler::class );
Queuety::dispatch( 'send_email', [
'to' => 'user@example.com',
'subject' => 'Welcome',
'body' => 'Hello from Queuety!',
] );실제 사용
PHP에서 정의한 워크플로와 이를 실행하는 작업자 명령입니다.
승인 워크플로
워크플로는 단계를 실행하고 24시간 대기한 다음, 다른 프로세스가 approval 시그널을 보낼 때까지 wait_for_approval()에서 일시 중지됩니다.
지연 시간은 데이터베이스에 저장되므로 작업자를 재시작하거나 배포해도 유지됩니다. 대기 전에 보낸 시그널도 기록되며 워크플로가 대기 단계에 도달하면 처리됩니다. 실행을 취소하면 on_cancel() 핸들러가 호출됩니다.
$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' ] );# Single worker on default queue
wp queuety work
# Process a specific queue
wp queuety work --queue=emails
# Process multiple queues in priority order
wp queuety work --queue=critical,default,low
# One-shot mode
wp queuety work --once
# Multi-worker mode
wp queuety work --workers=4
# Adaptive worker pool
wp queuety work --queue=providers --min-workers=2 --max-workers=6직접 MySQL 클레임
각 작업자는 오래 실행되는 WP-CLI 프로세스에서 실행되며, FOR UPDATE SKIP LOCKED를 사용해 MySQL에서 작업을 직접 가져옵니다.
지속성 있는 워크플로
상태가 저장되는 다단계 프로세스로, 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 프로세스에서 실행되므로 트래픽을 기다리지 않고 작업을 처리합니다.
에이전트 실행을 위한 안전장치
쿼럼 모드, 승인 단계와 max_transitions() 및 max_state_bytes() 같은 제한을 갖춘 for_each()은 장기 실행 에이전트 작업이 정해진 범위 안에서 진행되도록 합니다.
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 웹훅을 처리하며, 모든 작업을 관리자 인터페이스에 기록합니다. | Queuety와의 차이점Action Scheduler는 지연된 do_action()처럼 나중에 훅을 실행합니다. Queuety은 단계 사이에 상태가 유지되는 다단계 워크플로, 시그널 및 승인 대기, 상태 머신을 추가합니다. wp queuety workflow timeline 같은 WP-CLI 명령으로 워크플로를 살펴볼 수 있습니다. |
| Temporal | 잘하는 점지속성 있는 실행 플랫폼입니다. 이벤트 기록이 워크플로의 각 단계를 저장하므로, 충돌이나 중단 후에도 마지막으로 기록된 이벤트부터 실행을 재개할 수 있습니다. 서비스를 직접 호스팅하는 대신 Temporal Cloud를 사용할 수도 있습니다. | Queuety와의 차이점Temporal Service는 애플리케이션과 함께 실행되는 Go 서버와 데이터베이스로 구성됩니다. Queuety은 WordPress 데이터베이스 연결의 MySQL 테이블에 상태를 저장하고 WP-CLI을 통해 작업자를 실행합니다. |
질문과 답변
Queuety 문서의 간단한 답변.
기본 대기열의 간단한 작업에는 필요하지 않습니다. WordPress cron이 실행되는 한, 플러그인은 매분 WordPress cron을 통해 일회성 작업자를 실행하며 실행당 작업 하나를 처리합니다. 반복 일정, 사용자 지정 대기열 및 더 짧은 지연 시간에는 전용 wp queuety work 프로세스가 필요합니다.
아니요. mysqli 또는 pdo_mysql이 필요하며, WordPress에서는 기본적으로 mysqli를 선택합니다. 드라이버를 지정하려면 QUEUETY_DB_DRIVER을 auto, mysqli 또는 pdo로 설정하세요.
작업은 SELECT ... FOR UPDATE SKIP LOCKED를 사용해 가져옵니다. MySQL은 8.0부터, MariaDB은 10.6부터 이를 지원합니다. 프로젝트의 CI는 MySQL 8.0을 대상으로 실행됩니다.
네. 데이터베이스 기반 핵심 기능인 작업, 작업자, 워크플로, 시그널, 상태 머신, 아티팩트, 로그, 메트릭 및 일정은 직접 Connection을 대상으로 실행됩니다. 작업자 풀에는 DB_HOST, DB_NAME, DB_USER 및 DB_PASSWORD 상수도 필요합니다. Queuety::on_action(), replace_wp_cron(), 플러그인 초기화 및 wp queuety 명령은 여전히 WordPress이 필요합니다.
아직은 아닙니다. Queuety::replace_wp_cron()은 반복 wp_schedule_event() 이벤트를 Queuety 일정으로 변환하지만, 해당 훅 콜백을 아직 실행하지 않습니다. 실행되어야 하는 이벤트에는 계속 WP-Cron을 사용하세요. wp_schedule_single_event()의 이벤트는 WP-Cron에서 계속 처리합니다.
wp queuety work --workers=N은 고정된 작업자 풀을 분기하고 충돌한 하위 프로세스를 재시작합니다. pcntl 및 posix 확장이 필요합니다. --min-workers와 --max-workers를 사용하면 대기 작업이 늘어날 때 풀 규모를 키우고 한산해질 때 줄이는 적응형 풀을 실행합니다.
플러그인을 설치하고 작업자를 시작한 다음, 첫 작업부터 승인 워크플로와 상태 머신까지 안내서를 따라가세요.