@aiao/rxdb-plugin-trigger
@aiao/rxdb-plugin-trigger 是一个 browser-first 的任务运行时插件,为 RxDB 提供持久化任务调度与执行能力。
核心特性
- 持久化任务队列:Run/Schedule/Workflow 全部建模为 RxDB Entity,刷新不丢失
- 多 Tab 安全:通过条件 UPDATE SQL 实现 CAS(Compare-And-Swap),保证跨 tab 执行权唯一
- Cron 调度:支持 cron 表达式定时触发,含 missed tick catch-up 策略
- Workflow DAG:基于 WorkflowJSON 的有向无环图编排,支持条件分支、并行扇出/汇聚、节点重试
- Entity 触发器:监听 Entity 变更(create/update/remove)自动触发任务
- 三框架支持:React hooks、Angular injectables、Vue composables 开箱即用
- 运行时能力探测:自动检测 IndexedDB、Web Locks、Worker 可用性,不可用时优雅降级
- at-least-once 语义:所有副作用要求幂等,crash recovery 内置
安装
- npm
- Yarn
- pnpm
- Bun
npm install @aiao/rxdb-plugin-trigger
yarn add @aiao/rxdb-plugin-trigger
pnpm add @aiao/rxdb-plugin-trigger
bun add @aiao/rxdb-plugin-trigger
快速开始
1. 注册插件
import { RxDB } from '@aiao/rxdb';
import { rxDBPluginTrigger } from '@aiao/rxdb-plugin-trigger';
const rxdb = new RxDB({
/* ... */
});
rxdb.use(rxDBPluginTrigger, {
runRetentionDays: 3,
metadataRetentionDays: 7,
scheduleTickInterval: 2000
});
2. 定义并注册任务
const processOrder = rxdb.trigger.task({
id: 'process-order',
retry: { maxAttempts: 3, factor: 2, minTimeoutInMs: 1000 },
queue: { concurrencyLimit: 2 },
maxDuration: 30_000,
run: async (payload, ctx) => {
ctx.progress(10, '开始处理订单');
const result = await handleOrder(payload.orderId);
ctx.progress(100, '完成');
return result;
},
onSuccess: async ({ output }) => {
console.log('订单处理成功:', output);
},
onFailure: async ({ error }) => {
console.error('订单处理失败:', error.message);
}
});
3. 触发任务
// 异步触发,立即返回 RunHandle
const handle = await processOrder.trigger({ orderId: '12345' });
console.log('Run ID:', handle.id);
// 同步等待结果
const result = await processOrder.triggerAndWait({ orderId: '12345' });
if (result.ok) {
console.log('输出:', result.output);
}
4. 管理运行记录
// 查询运行详情
const run = await rxdb.trigger.runs.retrieve(handle.id);
// 取消运行
await rxdb.trigger.runs.cancel(handle.id);
// 重放运行
await rxdb.trigger.runs.replay(handle.id);
运行状态流
任务运行遵循以下状态机:
架构总览
插件选项
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
runRetentionDays | number | 3 | 完成的 Run 保留天数 |
metadataRetentionDays | number | 7 | metadata-only Run 保留天数 |
idempotencyRetentionDays | number | 14 | 幂等键保留天数 |
scheduleTickInterval | number | 2000 | Schedule 轮询间隔(ms) |
leaseDurationMs | number | 300000 | 执行锁租约时长(ms) |
leaseRenewalMs | number | 120000 | 租约续期间隔(ms) |
enableWorkflow | boolean | true | 启用 Workflow 引擎 |
catchUpPolicy | CatchUpPolicy | 'once' | Schedule 默认 catch-up 策略 |
syncPolicy | SyncPolicy | 'none' | 远端同步策略 |
运行时能力
插件在 install() 时自动检测浏览器能力:
const caps = rxdb.trigger.capabilities;
// {
// persistent: true, // IndexedDB 可用
// delaySafe: true, // 延迟任务可持久化
// scheduleSafe: true, // Cron 调度安全
// leaderElectionSafe: true, // Web Locks 可用
// workflowSafe: true, // Workflow 可持久化
// workerSafe: true, // Worker 可用
// }
相关文档
- 触发选项 — delay、重试、幂等键、并发控制
- Cron 调度 — 定时任务与 catch-up 策略
- Workflow — DAG 编排、条件分支、扇出/汇聚
- Entity 触发器 — 数据变更自动触发
- 框架集成 — React / Angular / Vue hooks