2012-12-09 39 views
3

我已经使用我的Rails项目设置了Sidekiq。它在独角兽的Heroku上运行。我已经通过所有包括设置适当的REDISTOGO_URL(as this question references),我已经添加了以下我在unicorn.rb after_fork的配置步骤走:如何获得在Heroku上运行的Sidekiq工作人员

after_fork do |server,worker| 
    if defined?(ActiveRecord::Base) 
     ActiveRecord::Base.establish_connection 
     Rails.logger.info('Connected to ActiveRecord') 
    end 

    Sidekiq.configure_client do |config| 
     config.redis = { :size => 1 } 
    end 
end 

我Procfile如下:

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb 
worker: bundle exec sidekiq 

现在我打电话给我的工作人员perform_async,它将任务添加到队列中。实际上,在我的Sidekiq网页界面中,它表示队列中有7个项目,并且其中包含所有数据。然而,没有工人正在处理队列和我的生活,我无法弄清楚为什么。如果我运行

heroku ps 

我得到以下输出:

=== web: `bundle exec unicorn -p $PORT -c ./config/unicorn.rb` 
web.1: up 2012/12/09 08:04:24 (~ 9m ago) 

=== worker: `bundle exec sidekiq` 
worker.1: up 2012/12/09 08:04:08 (~ 10m ago) 

任何人有任何想法是怎么回事?

更新

下面是我的工人类的代码。是的,我知道Oj宝石在sidekiq上可能存在一些问题,但我想先给它一个镜头。目前我没有收到任何错误信息(工作人员甚至没有运行)。

require 'addressable/uri' 
class DatasiftInteractionsWorker 
include Sidekiq::Worker 
sidekiq_options queue: "tweets" 

def perform(stream_id , interactions) 
    interactions = Oj.load(interactions) 
    interactions.each{ |interaction| 
     if interaction['interaction']['type'] == 'twitter' 
      url = interaction['links']['normalized_url'] unless interaction['links']['normalized_url'][0].nil? 
      url = interaction['links']['url'] if interaction['links']['normalized_url'][0].nil? 
      begin 
       puts interaction['links'] if url[0].nil? 
       next if url[0].nil? 
       host = Addressable::URI.parse(url[0]).host 
       host = host.gsub(/^www\.(.*)$/,'\1') 
       date_str = Time.now.strftime('%Y%m%d') 
       REDIS.pipelined do 
        # Add domain to Redis domains Set 
        REDIS.sadd date_str , host 
        # INCR Redis host 
        REDIS.incr(host + date_str) 
       end 
      rescue 
       puts "ERROR: Could not store the following links: " + interaction['links'].to_s 
      end 
     end 
    } 
end 
end 
+0

你看到你的Heroku的日志与[worker.1]什么?像'heroku logs -t | grep worker.1'(然后执行同步) –

+0

假设您正在使用免费计划,那么这意味着您只能访问一个工作人员。 –

+0

我正在为工人付款 –

回答

4

想通了,如果你使用一个自定义的队列,您需要了解Sidekiq在Procfile该队列,具体如下:

worker: bundle exec sidekiq -q tweets, 1 -q default 

我不太知道为什么,这是因为sidekiq知道所有队列。我将在Sidekiq项目上发布这个问题。

6

我的首选是创建一个/config/sidekiq.yml文件,然后在您的Procfile中使用worker: bundle exec sidekiq -C config/sidekiq.yml

Here's为例sidekiq.yml文件

相关问题