@aws-blocks/bb-cron-job (英语)
计划任务执行由 EventBridge 调度器和 Lambda 支持.
设计与模拟等价细节 : 设计
快速引用
共同业务 • 配置
| 你想怎样 | 如何配置 |
|---|---|
| 每N分钟运行一次 | schedule: 'rate(5 minutes)' |
| 每时每刻运行 | schedule: 'rate(1 hour)' |
| 协调世界时9点每天运行 | schedule: 'cron(0 9 * * ? *)' |
| 每天早上9点在太平洋运行 | schedule: 'cron(0 9 * * ? *)', timezone: 'America/Los_Angeles' |
| 将数据传递给处理器 | input: { mode: 'full' } |
| 禁用直到手动触发 | enabled: false |
关键词 : cron, 调度, 计时器, 周期性, 重复性, 速率, 事件桥, 背景, 间隔
快速启动
import { Scope } from '@aws-blocks/core';
import { CronJob } from '@aws-blocks/bb-cron-job';
const scope = new Scope('my-app');
const cleanup = new CronJob(scope, 'cleanup', {
schedule: 'rate(1 hour)',
handler: async (event) => {
console.log(`Running cleanup at ${event.scheduledTime}`);
await deleteExpiredRecords();
},
});
何时使用
- 运行定期清理任务( 过期会话、 陈旧数据)
- 生成预定报告
- 在计时器上变暖缓存
- 系统之间的数据同步
- 定期健康检查或监测
不使用时
- 因事件或用户动作而引发的一次性同步任务 使用
AsyncJob - 对数据变化的反应 – 相关建筑区使用事件订阅
选项
| 选项 | 类型 | 默认 | 说明 |
|---|---|---|---|
schedule | string | (必须) | Cron 或 速率表达式(见下文附表表达式) |
handler | (event: CronJobEvent<T>) => Promise<void> | (必须) | 每次引用时要执行的功能 。 一定是天真无能. |
enabled | boolean | true | 调度是否活动 |
description | string | —— 说 | 可读的工作说明 |
timezone | string | 'UTC' | 用于克龙表达式的IANA时区(例如, 'America/Los_Angeles'(中文(简体) ) |
input | T | —— 说 | 静态有效载荷在每次引用时都会传递给操作员 |
compute | ComputeProvider<'serverless'> | 瞄准镜的计算 | 无服务器 Compute 运行操作器( 参见运行在它自己的计算上) |
运行在自己的计算上
默认情况下, 处理器会运行在其范围上的计算, 这就是应用程序的默认
计算,除非范围设置一个(new Scope(id, { parent, compute })) (中文(简体) ). 传出 a
无服务器 Compute 赋予工作自己的功能,例如更多的记忆
或比API更长的超时:
import { Compute, CronJob } from '@aws-blocks/blocks';
const reports = new Compute(scope, 'reports', { type: 'serverless', memory: 2048, maxTimeoutSeconds: 900 });
new CronJob(scope, 'monthly-report', {
schedule: 'cron(0 3 1 * ? *)',
compute: reports,
handler: async () => { /* … */ },
});
仅a serverless 计算可以运行 CronJob 目前,因为时间表
直接引用计算函数。 通过一个 container 计算是一个类型
错误,而从范围中继承的容器计算失败。 当地,
每一个工作都会在dev服务器中运行 不管它的计算结果是什么.
调度表达式
速率表达式
简单的基于间隔的时间表 :
rate(1 minute)
rate(5 minutes)
rate(1 hour)
rate(12 hours)
rate(1 day)
rate(7 days)
线性表达式
AWS 事件Bridge cron格式( 6个字段) : cron(minute hour day-of-month month day-of-week year)
cron(0 9 * * ? *) → daily at 9:00 AM
cron(0 */2 * * ? *) → every 2 hours
cron(30 9 ? * MON-FRI *) → weekdays at 9:30 AM
cron(0 0 1 * ? *) → first day of every month at midnight
使用 ? 月一日或周一日(一个必须是 ?) (中文(简体) ).
处理器事件
处理者收到 CronJobEvent<T> 改为:
| 外地 | 类型 | 说明 |
|---|---|---|
scheduledTime | string | ISO 8601 预定援引时间的印章 |
jobName | string | CronJob的合格身份证明 |
input | T | 在 CronJob 上配置的静态输入( Nameundefined 未提供输入时) |
错误常数
import { CronJobErrors } from '@aws-blocks/bb-cron-job';
CronJobErrors.InvalidSchedule // schedule expression is not a valid cron or rate format
CronJobErrors.InvalidTimezone // timezone string is not a valid IANA timezone
两个出错都在施工时间被抛出(故障快速验证).
实例
带有时区( Timezone) 的 Cron 时间表
const dailyReport = new CronJob(scope, 'daily-report', {
schedule: 'cron(0 9 * * ? *)',
timezone: 'America/Los_Angeles',
description: 'Generate and email daily analytics report at 9 AM Pacific',
handler: async (event) => {
const data = await analytics.query({ date: event.scheduledTime });
await email.send('[email protected]', 'Daily Report', formatReport(data));
},
});
输入
new CronJob<{ keys: string[] }>(scope, 'cache-warmer', {
schedule: 'rate(5 minutes)',
input: { keys: ['top-products', 'featured'] },
handler: async (event) => {
for (const key of event.input.keys) {
await warmCache(key);
}
},
});
已禁用的工作( 仅限操作)
const migration = new CronJob(scope, 'data-migration', {
schedule: 'rate(1 day)',
enabled: false,
handler: async () => {
await migrateRecords();
},
});
操作器访问其他建筑块
const store = new KVStore(scope, 'sessions');
const sessionCleanup = new CronJob(scope, 'session-cleanup', {
schedule: 'rate(1 hour)',
handler: async () => {
const now = Date.now();
for await (const session of store.scan()) {
if (session.expiresAt < now) {
await store.delete(session.key);
}
}
},
});
一个处理器的多列表
const syncHandler = async (event: CronJobEvent<{ mode: string }>) => {
if (event.input.mode === 'incremental') await syncIncremental();
else await syncFull();
};
new CronJob<{ mode: string }>(scope, 'sync-hourly', {
schedule: 'rate(1 hour)',
input: { mode: 'incremental' },
handler: syncHandler,
});
new CronJob<{ mode: string }>(scope, 'sync-daily', {
schedule: 'cron(0 9 * * ? *)',
input: { mode: 'full' },
handler: syncHandler,
});
最佳做法
- 同上: EventBridge提供至少一次交货。 设计处理器可以容忍重复引用.
- 速率表达式 简单间隔; cron 表达式 准确的时间.
- 同时处决: 如果处理器运行的时间长于调度间隔,则下一个引用开始,而前一个仍在运行. 设计重叠或执行应用程序级别锁定
KVStore。 。 。 . - 处理失败 : Handler例外由Lambda的内置Aync引用再试政策(用指数回放2个回放)进行再试. 重复排出后,错误会被登录到 Cloud Watch.
地方发展
在本地 dev 模式下, CronJob 运行进度表 :
- 费率附表的使用
setInterval - Cron 时刻表计算下一个有时区支持和使用的起火时间
setTimeout - 当工作点火时控制台登录 :
[CronJob:{id}] triggered at {timestamp} - 何时
enabled: false,该调度不自动运行 - 处理失败者登录时警告 AWS 会重试
AWS 部署
自动规定 :
- 事件桥表 : 一个
AWS::Scheduler::Schedule每个 CronJob 实例 - 共享兰布达: 瞄准共享的Lambda(与API处理器和AsyncJob相同). 每一个工作都不要献身于Lambda.
- IAM角色: 每层事件 Bridge 调度器角色
lambda:InvokeFunction允许。 其信托政策仅限于该堆帐户和区域中的时间表(aws:SourceAccount+ 键aws:SourceArn匹配schedule-group/*) (中文(简体) ). - 计划名称 : 从CronJob的
fullId(转至64个字符)
密钥与 AsyncJob 的区分
克龙乔布是一个 纯基础设施申报 ——构造器定义了调度和处理器. 没有运行时间方法 submit() 或者说 submitBatch()。处理器自动运行在时间表上.
| 克龙乔布 | 阿辛克职业 | |
|---|---|---|
| 触发 | 时间(克伦/率) | 程序化( E)submit()(中文(简体) ) |
| 运行时间方法 | 无 | submit(), (中文(简体) ), submitBatch() |
| 使用大小写 | 定期重复的任务 | 一次性事件驱动的工作 |
| AWS 服务 | 事件桥排程器 | SQS + 蓝巴达 |