Actionhero分布式部署:Resque调度主节点如何分配任务至远程Worker?
Actionhero多节点下Resque调度主节点分配任务到远程Worker的实现逻辑
好的,咱们来拆解这个场景下的任务分配机制,核心其实是靠共享Redis实例作为中间层来实现的,具体流程和配置要点如下:
1. 核心依赖:所有节点共享同一个Redis
Actionhero集成的Resque是基于Redis来存储任务队列的,所以你的调度主节点(localhost:8080)和Worker节点(localhost:8000)必须连接完全相同的Redis服务器——这是任务能跨节点分配的基础。
你需要确保两个节点的config/resque.js(或对应语言的配置文件)里的Redis配置完全一致,比如:
exports.default = { resque: function(api){ return { redis: { host: "your-shared-redis-host", // 比如同一台服务器的IP或者Redis集群地址 port: 6379, password: "your-redis-password", // 如果有密码的话 database: 0 // 要使用同一个数据库编号 }, // 其他Resque配置... } } }
2. 调度主节点的任务生产逻辑
当你把localhost:8080设为scheduler: true后,这个节点会承担以下角色:
- 按照你配置的定时/周期性任务规则(比如
tasks/目录下定义的任务),生成待执行的任务 - 将这些任务推送到Resque的指定队列中——这个队列是存储在共享Redis里的,不是节点本地内存
举个例子,你在调度节点定义一个定时任务:
exports.default = { dailyCleanupTask: { name: "dailyCleanupTask", description: "清理过期数据的每日任务", queue: "cleanup", // 指定任务要进入的队列名 frequency: 86400000, // 24小时执行一次 run: function(api, params, next){ // 这里写具体的任务逻辑 api.log("执行每日清理任务", "info"); next(null, "清理完成"); } } }
调度主节点到时间就会把这个任务推送到Redis里的cleanup队列。
3. Worker节点的任务消费逻辑
localhost:8000节点设置scheduler: false后,它就只做Worker的工作:
- 监听你配置的Resque队列(在
resque.queues数组里指定) - 从共享Redis的对应队列中拉取待执行的任务,然后执行
你需要在Worker节点的config/resque.js里配置要监听的队列,确保和调度主节点推送任务的队列名一致:
exports.default = { resque: function(api){ return { scheduler: false, queues: ["cleanup", "default"], // 包含调度节点推送任务的队列名 // 其他配置... } } }
这样Worker节点就会自动从Redis的cleanup队列里取调度主节点推送的任务来执行。
4. 关键注意事项
- 队列名称必须匹配:调度节点推送到哪个队列,Worker节点就得监听哪个队列,不然Worker拿不到任务
- 任务定义要同步:所有节点的
tasks/目录下的任务文件必须完全一致——因为Worker节点需要知道任务的执行逻辑(run方法),如果代码不一致会导致执行出错 - 自动负载均衡:如果有多个Worker节点监听同一个队列,Resque会自动做负载均衡,Worker会按顺序从队列取任务执行
内容的提问来源于stack exchange,提问作者Tauseef Rehan
相关产品推荐
相关产品推荐

