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 小时,然后在 wait_for_approval() 处暂停,直到另一个进程发送 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 回退方案
无法访问 shell 时,每分钟触发一次的 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 | 擅长领域专为在插件和主题中分发而设计,无需服务器访问权限;它每月处理数百万笔订阅付款和 WooCommerce 的 Webhook,并在管理界面中记录每项操作。 | 与 Queuety 的区别Action Scheduler 会在稍后的时间运行钩子,例如延迟的 do_action()。Queuety 增加了多步骤工作流,其状态会在步骤之间持久保存,还支持等待信号和审批,以及状态机;你可以通过 WP-CLI 命令(例如 wp queuety workflow timeline)进行检查。 |
| Temporal | 擅长领域一个持久化执行平台:事件历史会记录工作流的每个步骤,因此发生崩溃或中断后,运行会从最后记录的事件处恢复;Temporal Cloud 则可作为自行托管服务的替代方案。 | 与 Queuety 的区别Temporal Service 是一个 Go 服务器和数据库,会与应用一起运行。Queuety 将状态保存在 WordPress 数据库连接上的 MySQL 表中,并通过 WP-CLI 运行工作进程。 |
问答
来自 Queuety 文档的简明解答。
默认队列中的简单任务不需要。只要 WordPress cron 正常触发,插件就会每分钟通过 WordPress cron 启动一次性工作进程,每次运行处理一个任务。周期性调度、自定义队列和更低延迟则需要专用的 wp queuety work 进程。
不需要。在 WordPress 下,它需要 mysqli 或 pdo_mysql,并默认选择 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 则会运行自适应工作进程池,根据积压任务增加进程数量,并在任务减少时缩减。
安装插件,启动工作进程,然后按照指南从第一个任务开始,逐步了解审批工作流和状态机。