使用 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', // 自托管
})
}
}
后续
- 拉代码 二开再打包
- 阅读一下源码