Javascript is required
使用 Trigger.dev 完成后台作业

Trigger.dev 开源后台作业平台

以正常的异步代码编写工作流,我们将处理其余部分,从队列到弹性扩展。无超时、重试、可观察性,并且无需管理任何基础设施。

基础设置

  • Docker
  • Docker-compose
  • 云服务 1 个 或 多个
  • Debian 或衍生版本 (注意系统版本最好一致)
  • 阿里云镜像服务

编程要求: Typescript | javascript 使用 node 环境 编写任务

优点

  • 可观测性
  • 进行测试任务 并不是与程序绑定, 可以在后台直接测试
  • 自定义警报
  • 进行版本控制
    • 每次部署都会是一个新的版本 , docker 镜像也是版本区分,如果有问题可以进行快速回滚
  • 多环境
    • 内置了 dev / test / prd 环境 可以配置环境变量
  • 任务重试 / 错误处理

可以与 node 相关技术栈快速整合 比如 nuxt/ nest /next 等等


一般来说用 Node 开发后台作业,选用的组件是

并且也提供了一个面板去观察任务执行情况

后来发现了 trigger.dev 于是自托管并且把业务迁移到这里。

trigger.dev 后台可以看到更为具体的信息 方便排查问题

自托管

参考文档以及

分两部分一部分提供后台 比如 webapp, worker 是执行任务的环境,可以 allinOne 也可以分服务器单独部署

开发流程

开发阶段基本都是使用 cli 去登录/退出登录/启动服务/部署服务

本地开发 新建到 package.json

"dev": "pnpm dlx trigger.dev@3.3.10 dev --skip-update-check",

每次保存文件都会生成一个版本 ,然后到控制台 test 发送 payload 执行任务,这时候每次任务执行所消耗的资源是当前电脑

部署阶段

// package.json
"deploy": "pnpm dlx trigger.dev@3.3.10 deploy -a https://xxx.com -e prod --self-hosted --skip-update-check --push --namespace taoya7"

确认流程没有问题, 执行 deploy 注意锁定版本号与自托管版本一致。 同时后面的参数也是必填的。

这会在本地构建 Docker 镜像,然后推送到云服务器上。 我这里配置的阿里云镜像服务

每次 deploy 镜像名称是 project_xxx:日期:版本号

当我们执行环境为生产环境,服务器会拉取镜像

同时临时启动一个 Docker 容器来跑任务

后端调用

注意版本号一致

pnpm i @trigger.dev/sdk
import { myOtherTask, runs } from "~/trigger/my-other-task";

export const myTask = task({
  id: "my-task",
  run: async (payload: string) => {
    const handle = await myOtherTask.trigger({ foo: "some data" });

    const run = await runs.retrieve(handle);
    // Do something with the run
  },
});

handle 会返回

  • Run ID
  • 以及一个 Token
{
  id: 'run_ipkwctszv6ka9j6haw1yr', 
  publicAccessToken: 'e'
}

例如我的后端是 midway开发

export class ContainerLifeCycle {
  @App()
  app: IMidwayApplication

  @Inject()
  logger: ILogger

  @Inject()
  decoratorService: MidwayDecoratorService

  async onReady() {
    this.decoratorService.registerParameterHandler('platform', (options) => {
      return options.originArgs[0]?.headers.platform ?? ''
    })
    configure({
      secretKey: 'asdasd', // WARNING: Never actually hardcode your secret key like this
      baseURL: 'https://xxx', // 自托管
    })
  }
}

后续

  1. 拉代码 二开再打包
  2. 阅读一下源码