如何配置Cube.js预聚合每12小时或指定UTC时间(凌晨4点)刷新?
Cube.js预聚合固定间隔/特定时间自动刷新配置方案
一、配置固定间隔或特定时间刷新
Cube.js的预聚合刷新可通过refreshKey的schedule字段(基于标准Cron表达式)实现固定时间点或间隔的自动刷新,替代原有的every相对时间配置。以下是修改后的Orders Cube代码:
cube('Orders', { sql: `SELECT id, user_id, total_price, added_at FROM public.orders`, preAggregations: { OrdersSummary: { dimensions: [Orders.id, Orders.userId, Orders.totalPrice], // UTC时间每12小时刷新一次(0分触发) refreshKey: { schedule: '0 */12 * * *' } }, OrdersDetails: { dimensions: [Orders.id, Orders.userId, Orders.addedAt], // UTC时间每天凌晨4点固定刷新 refreshKey: { schedule: '0 4 * * *' } } }, dimensions: { id: { sql: `id`, type: `number`, primaryKey: true }, userId: { sql: `user_id`, type: `number` }, totalPrice: { sql: `total_price`, type: `number` }, addedAt: { sql: `added_at`, type: `time` } } });
Cron表达式说明:
0 */12 * * *:每12小时的0分执行一次,实现固定12小时间隔刷新0 4 * * *:每天UTC时间4点0分执行一次,满足特定时间点刷新需求
二、解决刷新行为不一致问题
测试时出现刷新不按时触发的情况,通常是以下原因导致:
- 默认按需刷新机制:Cube.js默认只有当有查询请求触发预聚合时,才会检查是否需要刷新。无查询请求时,不会主动执行刷新。
- 未开启调度器:要实现主动定时刷新,需在Cube.js配置文件(
cube.js)中开启调度器:
module.exports = { scheduler: true, scheduledRefreshTimer: 60, // 每隔60秒检查一次刷新任务,可按需调整 };
- 服务运行状态:确保Cube.js服务持续运行,调度器才能正常轮询并执行刷新任务。
验证刷新是否生效的方式:查看Cube.js服务日志,搜索Pre-aggregation refresh相关日志条目,确认刷新任务的触发时间和执行结果。
三、重要注意事项
- Cron表达式基于UTC时间,若需适配本地时区,需自行计算时区偏移后调整表达式。
every字段是基于上次刷新时间的相对间隔,而schedule是绝对时间点,更适合固定间隔或特定时间的刷新需求。- 预聚合刷新会消耗数据库资源,建议选择业务低峰期执行。
内容的提问来源于stack exchange,提问作者Abdellah-ELAAROUB
相关产品推荐
相关产品推荐

