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

Heroku环境下Sidekiq任务入队但未执行问题求助

排查Sidekiq任务入队但未调度的问题

先帮你梳理下场景和核心问题:

  • 用户注册成功后,你会触发两个异步操作:调用UpdateAvatarWorker.perform_async(user.id)同步Facebook头像到S3,以及在用户邮箱非空时调用UserMailer.welcome_email(user).deliver_later发送欢迎邮件
  • 目前这两个任务在Sidekiq Web UI中显示已入队,但始终没有被调度执行

下面给你几个实用的排查方向,你可以一步步验证:

1. 确认Sidekiq进程是否正在运行

这是最基础也最容易忽略的点:

  • 打开终端执行 ps aux | grep sidekiq,检查是否有Sidekiq进程在运行
  • 如果进程未启动,在项目根目录执行 bundle exec sidekiq 启动进程,注意要确保和你的Rails应用使用相同的环境(比如development)

2. 检查Sidekiq配置文件的完整性

你提到config/sidekiq.yml的development配置开头是:concurrency:...,建议确认配置是否完整,尤其是队列配置:
比如如果你的worker指定了自定义队列:

class UpdateAvatarWorker
  include Sidekiq::Worker
  sidekiq_options queue: :avatars
end

那你的sidekiq.yml需要明确包含这些队列:

development:
  :concurrency: 5
  :queues:
    - default
    - avatars
    - mailers # Action Mailer的deliver_later默认使用mailers队列

如果队列未配置,Sidekiq进程只会监听默认队列,自定义队列的任务就会一直处于待执行状态。

3. 验证队列名称是否匹配

  • 检查UpdateAvatarWorker是否指定了队列,若有指定,要和Sidekiq启动时监听的队列完全一致
  • 对于邮件任务,Rails默认将其放入mailers队列,要确保Sidekiq配置包含该队列,或者启动时加上参数 --queue mailers

4. 确认Redis连接正常

Sidekiq依赖Redis存储任务,需验证Redis服务状态和连接配置:

  • 执行 redis-cli ping,返回PONG说明Redis正常运行
  • 检查config/initializers/sidekiq.rb中的Redis配置是否正确,示例:
Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://localhost:6379/0' }
end

Sidekiq.configure_client do |config|
  config.redis = { url: 'redis://localhost:6379/0' }
end

如果Redis地址或端口错误,Sidekiq进程无法获取任务,就会出现入队但不执行的情况。

5. 查看Sidekiq日志定位问题

启动Sidekiq时开启日志输出:bundle exec sidekiq -L log/sidekiq.log,然后查看log/sidekiq.log中的内容,有没有Redis连接失败、队列不存在、worker代码报错等信息,日志能帮你快速定位具体问题。

6. 验证Worker代码可正常执行

有时候worker本身的代码有语法错误或逻辑问题,也会导致任务无法执行:
你可以在Rails控制台手动执行 UpdateAvatarWorker.new.perform(user.id),看看是否有报错,排查代码层面的问题。

按照这些步骤排查下来,应该能找到任务未调度的原因啦!

内容的提问来源于stack exchange,提问作者gates

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:27:32