3

Rails プロジェクトで Sidekiq をセットアップしました。Heroku と Unicorn で実行しています。適切な REDISTOGO_URL の設定を含むすべての構成手順を実行しました (この質問が参照するように)。unicorn.rb の after_fork に以下を追加しました。

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

私のプロファイルは次のとおりです。

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

今、ワーカーを perform_async に呼び出し、タスクをキューに追加します。実際、私の Sidekiq Web インターフェイスでは、キューに 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 gem には 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
4

2 に答える 2

4

カスタムキューを使用している場合は、次のように、SidekiqにProcfile内のそのキューを認識させる必要があることがわかりました。

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

sidekiqはすべてのキューを認識しているため、なぜこれが当てはまるのかよくわかりません。Sidekiqプロジェクトの問題としてこれを投稿します。

于 2012-12-10T00:17:07.933 に答える