ActiveJob任务入队后消失未执行问题排查及日志方案咨询
Resque任务入队后未执行的排查方案(针对SendMarketJob)
可能的原因
- 队列监听配置问题:负责消费
console_high队列的Resque Worker进程未启动,或者Worker启动时指定的队列列表不包含console_high,导致任务一直留在队列中无人处理。 - 任务参数反序列化失败:任务携带的GlobalID对应的
Market记录已被删除,或GlobalID配置异常(比如模型命名空间变更),导致Worker在反序列化参数时出错,且该异常未输出到ActiveJob日志中。 - Redis数据异常:任务入队后Redis连接中断导致数据未持久化,或Redis实例发生数据丢失、键被误删除,使得任务从队列中消失。
- 任务静默失败:任务在执行前(如参数验证、模型加载阶段)抛出异常,但ActiveJob/Resque的异常处理配置未捕获该异常,也未生成失败日志,导致任务被静默丢弃。
- 队列阻塞或优先级问题:
console_high队列中存在大量积压任务,或有长时间运行的任务占用Worker资源,导致目标任务无法被调度执行。 - 版本兼容bug:Rails 5.8.2.1与Resque 2.4.0的ActiveJob适配器存在特定场景下的兼容问题,导致任务入队后无法被Worker拾取。
排查日志及验证方案
1. 增强Resque Worker日志
启动Worker时开启 verbose 模式,或配置单独的Worker日志文件,记录任务拾取、反序列化、执行的全流程:
# 启动监听console_high队列的Worker并开启详细日志 VERBOSE=1 QUEUE=console_high rake resque:work # 或指定日志文件 LOGFILE=log/resque_console_high.log VERBOSE=1 QUEUE=console_high rake resque:work
2. 给SendMarketJob添加生命周期日志钩子
在Job类中添加前置、环绕、异常捕获钩子,强制记录任务状态:
class SendMarketJob < ApplicationJob queue_as :console_high before_perform do |job| Rails.logger.info "[SendMarketJob] [#{job.job_id}] 开始执行,参数:#{job.arguments.inspect}" end around_perform do |job, block| start_time = Time.now Rails.logger.info "[SendMarketJob] [#{job.job_id}] 进入执行流程" begin block.call Rails.logger.info "[SendMarketJob] [#{job.job_id}] 执行完成,耗时:#{(Time.now - start_time).round(2)}ms" rescue => e Rails.logger.error "[SendMarketJob] [#{job.job_id}] 执行失败,错误信息:#{e.message}\n堆栈跟踪:#{e.backtrace.join("\n")}" raise e # 保留异常,让Resque标记任务为失败 end end def perform(market) # 原有业务逻辑代码 end end
3. 验证Redis队列状态
通过Redis命令直接检查队列和失败任务:
# 查看console_high队列的任务数量 redis-cli LLEN resque:queue:console_high # 查看队列中的任务内容(取前1条) redis-cli LRANGE resque:queue:console_high 0 0 # 检查失败队列中的任务 redis-cli LLEN resque:failed redis-cli LRANGE resque:failed 0 -1
4. 验证GlobalID有效性
在Rails控制台手动验证任务参数的GlobalID是否可正常解析:
# 替换为任务中的实际GlobalID字符串 market = GlobalID::Locator.locate('gid://console/Market/57141') puts market.present? ? "Market记录存在:#{market.id}" : "Market记录不存在"
5. 检查Worker进程状态
确认监听console_high的Worker是否在运行:
ps aux | grep resque | grep console_high # 查看Worker的启动日志,确认是否有异常退出记录 tail -f log/resque_console_high.log
6. 启用Resque任务状态监控
通过resque-web查看任务的全生命周期状态,或安装resque-status插件跟踪任务的入队、执行、完成/失败状态。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

