多项目共享资源:Ruby 定时任务基于 Whenever 的动态扩缩容方案
核心问题
在多项目共享服务器资源场景中,需实现:
- 多个 Ruby 项目共用 Whenever 管理定时任务
- 根据负载动态扩缩容(如高峰期增加任务频率)
- 避免项目间配置冲突
解决方案架构
graph LR
A[配置中心] -->|推送| B[项目1]
A -->|推送| C[项目2]
B --> D[crontab]
C --> D
D --> E[动态执行]
一、环境配置
-
共享基础设置:
ruby# config/whenever_shared.rb set :environment, ENV['RAILS_ENV'] set :output, '/var/log/cron.log' -
项目独立标识:
ruby# 项目A的 config/schedule.rb set :whenever_identifier, 'project_a'
二、动态扩缩容实现
-
环境变量控制:
rubyevery ENV.fetch('TASK_INTERVAL', '1.hour') do runner "DataSync.perform" end -
自动更新脚本 (
bin/update_crontab):bash#!/bin/bash # 从配置中心获取最新参数 export TASK_INTERVAL=$(curl -s config-server/project_a/interval) # 动态更新crontab bundle exec whenever --update-crontab \ --load-file config/schedule.rb \ --set environment=$RAILS_ENV
三、多项目协调
-
冲突预防机制:
ruby# 在任务定义中添加项目锁 every 30.minutes do command "flock -n /tmp/project_a.lock ./task.sh" end -
资源配额管理:
ruby# 根据CPU负载动态调整 every ENV['TASK_INTERVAL'] do runner do if SystemLoad.avg1 < 0.7 HeavyJob.perform else LightJob.perform end end end
部署流程
-
初始化:
bash# 所有项目共享初始化 gem install whenever -
动态更新触发:
bash# 通过cron自身实现循环更新 */5 * * * * /path/to/bin/update_crontab
监控指标
定义扩缩容决策矩阵:
| 指标 | 阈值范围 | 动作 |
|---|---|---|
| CPU 使用率 | \>0.8 | 延长任务间隔 20% |
| 内存空闲 | \<1\\text{GB} | 暂停非关键任务 |
| 队列积压量 | \>1000 | 增加任务频率 50% |
注意事项
-
使用文件锁防止并发更新:
bashflock -n /tmp/cron_update.lock update_script -
配置版本控制:
rubyset :cron_log, "/var/log/#{ENV['APP_VERSION']}_cron.log"
此方案通过环境变量动态注入配置,配合定时更新机制,实现多项目共享资源时的弹性调度,同时保证各项目配置隔离性。