跳转到正文

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 进程中运行,并使用 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 文档的简明解答。

安装插件,启动工作进程,然后按照指南从第一个任务开始,逐步了解审批工作流和状态机。