Sidekiq mailers队列未处理任务求助(Rails4.2.10+Ruby2.4.3)
解决Sidekiq Mailers队列任务卡住不处理的问题
针对你使用Rails 4.2.10 + Ruby 2.4.3时,Sidekiq的mailers队列进程运行但不处理任务,且任务在Busy标签页1分钟后消失的问题,结合你的日志(只有任务start记录,无完成/失败日志),可以按照以下步骤排查解决:
1. 先验证邮件发送本身是否正常
Sidekiq的邮件任务卡住,大概率是邮件发送环节阻塞了,先跳过Sidekiq直接测试:
- 打开Rails控制台:
rails c - 执行直接发送邮件的命令:
ActionMailer::Base.mail(to: 'your-test-email@example.com', subject: 'Test Direct Send', body: 'This is a test').deliver_now
- 如果这个命令卡住或报错,说明是邮件配置(比如SMTP参数)的问题,优先解决这个:
- 检查对应环境的配置文件(如
config/environments/production.rb)里的SMTP设置:address、port、user_name、password、authentication、openssl_verify_mode、timeout等参数是否正确,尤其是SMTP服务器是否允许你的服务器IP访问,或者有没有开启两步验证导致密码失效。
- 检查对应环境的配置文件(如
- 如果直接发送成功,再回到Sidekiq的问题排查。
2. 调整Sidekiq任务超时设置
你的任务正好在1分钟后消失,和Sidekiq默认1分钟的任务超时限制完全吻合:当任务执行超过1分钟,Sidekiq会强制终止线程,但不会标记任务失败(导致日志只有start记录)。
- 在
config/initializers/sidekiq.rb里添加针对mailers队列的超时配置:
Sidekiq.configure_server do |config| config.queue_config_hash = { 'mailers' => { timeout: 15.minutes } # 根据实际邮件发送耗时调整,比如设置为15分钟 } end
- 重启Sidekiq服务,观察任务是否能正常完成。
3. 控制Sidekiq邮件队列的并发数
如果同时发送大量邮件,可能会耗尽SMTP连接池或者被邮件服务器限流,导致任务全部卡住:
- 启动Sidekiq时指定
mailers队列的并发数,比如限制为5个线程:
sidekiq -q mailers -c 5
- 避免并发数过高,根据你的邮件服务器的限制调整合适的数值。
4. 捕获任务执行的异常信息
有时候任务执行中出现异常但未被Sidekiq捕获,导致任务被静默终止:
- 在
config/initializers/sidekiq.rb里添加错误处理器,把异常记录到日志:
Sidekiq.configure_server do |config| config.error_handlers << proc { |exception, context_hash| Rails.logger.error "[Sidekiq Error] #{exception.class}: #{exception.message}" Rails.logger.error exception.backtrace.join("\n") } end
- 重启Sidekiq后,查看Rails日志(如
log/production.log),看是否有邮件任务相关的异常堆栈信息,定位具体问题。
5. 确认Sidekiq队列配置和Redis连接
- 确保Sidekiq确实在监听
mailers队列:启动Sidekiq时明确指定队列sidekiq -q mailers,避免队列名称拼写错误或Sidekiq配置里没包含该队列。 - 在Rails控制台里检查队列任务数:
Sidekiq::Queue.new('mailers').size,确认任务确实被加入了队列。 - 检查Redis服务状态:确保Redis正常运行,Sidekiq能正常连接(可以通过Sidekiq Web Dashboard查看Redis连接信息)。
内容的提问来源于stack exchange,提问作者NikD
相关产品推荐
相关产品推荐

