Sidekiq冻结申请

时间:2013-09-21 00:12:51

标签: ruby-on-rails ruby redis rake sidekiq

所以,我有一个代码,是rake任务的一部分:

  class DrivingStatJob < DBJob
  sidekiq_options :queue => :driving_stats, :backtrace => true

  def perform(work_order_id)
    Rails.logger.info "Calculating driving stats for work_order #{work_order_id}"
    begin
      work_order = WorkOrder.find(work_order_id)
      return unless work_order.steps.size > 1
      DrivingStat.calculate!(work_order.steps.first.location.address, work_order.steps.last.location.address)
    rescue DrivingStatService::MissingCoordinatesError
      Rails.logger.warn "Unable to fetch coorindates for work order #{work_order_id}"
    rescue ActiveRecord::RecordInvalid => e
      Rails.logger.warn "Unable to save driving stat: #{e.message}"
    rescue ActiveRecord::RecordNotFound
      # Ignore
    rescue RuntimeError => e
      Rails.logger.warn "Unable to compute driving directions"
      Rails.logger.warn [e.message, e.backtrace].join("\n")
    end
  end
end

调用“执行”的代码:

begin
  DrivingStatJob.perform_async(id) if changed
rescue Redis::CannotConnectError => e
  logger.warn "Unable to queue up driving stats job"
  logger.warn [e.message, e.backtrace].join("\n")
end

问题:它挂在DrivingStatJob.perform_async(id)上。它只是挂起,没有错误。没有来自“执行”功能的日志消息。可能是什么? Redis没有错误,sidekiq没有错误。 Redis在127.0.0.1:6379上运行,Sidekiq表明它知道Redis在那里。

Linux Mint 15,Ruby 1.9.3,Redis 2.6,sidekiq-2.14。

5 个答案:

答案 0 :(得分:0)

很难说是怎么回事。找到答案的方法是在执行方法中放置debugger并在前台运行sidekiq worker。这让你有机会逐步完成这些方法。

您最终会进入Sidekiq::Clients push method。这就是它变得有趣的地方。

bundle exec sidekiq

对于1.9,您可以使用debugger gem

答案 1 :(得分:0)

您可以从rake任务访问sidekiq的路线吗?在控制器中尝试它,看看它是否与rake任务有关。也许你错过了包含或要求。如果你摆脱救援区,它会崩溃并发出错误吗?

我认为您正在捕捉Redis的连接错误,但它确实尝试连接到Sidekiq,而Sidekiq又使用redis。

我只是在这里吐出想法...

答案 2 :(得分:0)

对perform_async的调用挂起。 perform_async将作业写入Redis,但尚未执行。我猜这个工作永远不会到达Redis所以sidekiq工作者永远不会得到改变。因此,您看不到perform方法的记录。你能看到Redis的工作吗?

如果您正在使用rails,可以将其添加到routes.rb文件中,以便能够检查sidekiq队列。

require 'sidekiq/web'
mount Sidekiq::Web, at: '/sidekiq'

如果您可以在sidekiq队列中看到该作业,则必须启动一名工作人员来处理该表演。如果没有工作,您必须检查Redis连接。

答案 3 :(得分:0)

如果要在除默认值之外的任何队列中调度作业,则需要在启动sidekiq时显式传入队列名称。

bundle exec sidekiq -q driving_stats

此外,您可能需要确保在正确的环境中运行它

bundle exec sidekiq -q driving_stats -e production

bundle exec sidekiq -q driving_stats RAILS_ENV=production

如果由于某种原因不能正常工作,请完全取出sidekiq_options并使用简单的

在默认队列中运行它
bundle exec sidekiq

另外:您是否将sidekiq工作人员包括在您的父母或子女课程中?

class DBJob
  include Sidekiq::Worker
end

答案 4 :(得分:0)

问题出在Redis配置中。它使用了Sentinel,关闭Sentinel以进行开发解决了它。