任务队列

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 的强大能力。

  1. 任务(Tasks)
  2. 工作流(Workflows)
  3. 作业(Jobs)
  4. 队列(Queues)

所有这些组件协同工作,使你能够将长时间运行、资源密集型或未来计划的工作从主 API 中分离出来。

以下是简要概述:

  • 任务(Task)是执行特定业务逻辑的函数
  • 工作流(Workflow)是按顺序运行的特定任务组合,可以从故障点重试
  • 作业(Job)是单个任务或工作流的执行实例
  • 队列(Queue)是将作业分组的方式 - 例如,有些可以每晚运行,而其他可以每 10 分钟运行