You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:07:02