任务队列
Payload 的 Jobs Queue 提供了一种简单而强大的方式,可以将大型或未来任务卸载到单独的计算资源上,这是许多应用框架中非常强大的功能。
使用场景示例
非阻塞工作负载
你可能需要在 Payload Hook 中执行一些复杂、耗时的逻辑,但又不希望这个 hook "阻塞"或减慢 Payload API 的响应速度。与其直接在 hook 中运行这些逻辑(这会导致 API 响应必须等待耗时工作完成后才能返回),你可以将新任务加入队列,让它稍后运行。
示例:
- 从文档创建向量嵌入,并在文档变更时保持同步
- 在文档变更时将数据发送到第三方 API
- 根据客户行为触发电子邮件发送
定时操作
如果你需要安排某个操作在未来特定时间运行或处理,可以设置 waitUntil
属性来排队任务。这将使任务直到 waitUntil
指定的时间过后才会被"拾取"执行。
示例:
- 处理预定发布的文章,其中预定发布时间设置在将来
- 在指定时间取消发布文章
- 在客户试用注册 X 天后发送提醒邮件
定期同步或类似定时操作
某些应用可能需要定期执行某种类型的操作。Jobs 非常适合这种情况,因为你可以使用 cron
来执行它们的逻辑,比如每晚、每12小时或其他类似时间间隔执行一次。
示例:
- 希望定期向所有客户发送电子邮件
- 在夜间定期触发前端重建
- 在非高峰时段与第三方 API 同步资源
卸载复杂操作
在某些情况下,你可能需要执行计算密集型函数,这可能会拖慢主 Payload API 服务器的性能。通过 Jobs Queue(任务队列),你可以将这些任务卸载到单独的计算资源上执行,而不会影响运行 Payload API 的服务器性能。借助 Payload 任务定义,你甚至可以将大型依赖项排除在主 Next.js 包之外,仅在需要使用时动态导入它们。这能保持你的 Next.js + Payload 编译速度,并确保大型依赖项不会被打包进 Payload 生产构建中。
典型应用场景:
- 需要在文档变更时创建(并保持同步)向量嵌入,但使用的是开源模型来生成嵌入
- 拥有 PDF 生成器,需要动态构建文档的 PDF 版本并发送给客户
- 需要使用无头浏览器执行某些逻辑操作
- 需要执行一系列操作,其中每个操作都依赖于前一个操作,并且应尽可能以"持久化"方式运行
工作原理
在使用 Payload 的 Jobs Queue 之前,你需要熟悉几个核心概念。我们建议了解每个概念的功能,以便充分掌握如何利用 Payload Jobs Queue 的强大能力。
所有这些组件协同工作,使你能够将长时间运行、资源密集型或未来计划的工作从主 API 中分离出来。
以下是简要概述:
- 任务(Task)是执行特定业务逻辑的函数
- 工作流(Workflow)是按顺序运行的特定任务组合,可以从故障点重试
- 作业(Job)是单个任务或工作流的执行实例
- 队列(Queue)是将作业分组的方式 - 例如,有些可以每晚运行,而其他可以每 10 分钟运行