2012-03-28 1 views
3

많은 이메일을 보내야하는 앱을 작성 중이며 이러한 이메일 때문에 많은 사용자 알림이 생성됩니다. 이 작업은 Heroku에서 시간 초과를 생성합니다. 이를 해결하기 위해 Resque 및 RedistToGo를 사용하기로 결정했습니다.Resque with Rails 3 + Heroku + RedisToGo Postgresql 오류가 발생합니다.

내가 한 것은 전자 메일 (실제로는 Sendgrid를 사용하기 때문에 하나의 전자 메일 임)을 보내고 Resque 작업자를 사용하여 알림을 작성하는 것입니다. 전자 메일은 이미 생성되었으므로 ID를 모든 수신자와 함께 작업자에게 보냅니다.

로컬로 잘 작동합니다. 프로덕션에서는 Heroku에서 앱을 다시 시작하지 않으면 한 번만 작동합니다.

class Email < ActiveRecord::Base 

... 

after_create :enqueue_email 

    def enqueue_email 
    Resque.enqueue(MassiveEmailSender, self.id, self.recipients) 
    end 

... 

end 

이 이메일 모델은 또한 send_email 방법이있다 : 나는 노동자를 큐에 넣 after_create이있는 이메일 모델을 가지고

#lib/tasks/resque.rake 
require 'resque/tasks' 

task "resque:setup" => :environment do 
    ENV['QUEUE'] = '*' 
end 

desc "Alias for resque:work (To run workers on Heroku)" 
task "jobs:work" => "resque:work" 


#config/initalizers/resque.rb 
ENV["REDISTOGO_URL"] ||= "redis://redistogo:[email protected]_url:some_number/" 

uri = URI.parse(ENV["REDISTOGO_URL"]) 
Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password) 

Dir["#{Rails.root}/app/workers/*.rb"].each { |file| require file } 


#app/workers/massive_email_sender.rb 
class MassiveEmailSender 
    @queue = :massive_email_queue 

    def self.perform(email_id, recipients) 
    email = Email.find(email_id.to_i) 
    email.recipients = recipients 
    email.send_email 
    end 

end 

: 내 코드의 일부와 오류 메시지를 게시 할 예정입니다 내가 전에 말한 것을 수행합니다.

다음과 같은 오류 메시지가 나타납니다. 그것이 있어야 정확하게 ...

Worker 
    9dddd06a-2158-464a-b3d9-b2d16380afcf:1 on massive_email_queue at just now 
    Retry or Remove 
Class 
    MassiveEmailSender 
Arguments 

    21 
    ["[email protected]", "[email protected]"] 

Exception 
    ActiveRecord::StatementInvalid 
Error 
    PG::Error: SSL error: decryption failed or bad record mac : SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = '"emails"'::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum 

    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1139:in `async_exec' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1139:in `exec_no_cache' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:663:in `block in exec_query' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log' 
    /app/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.2/lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log' 
    /app/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.3.2/lib/new_relic/agent/instrumentation/active_record.rb:31:in `block in log_with_newrelic_instrumentation' 
    /app/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.3.2/lib/new_relic/agent/method_tracer.rb:242:in `trace_execution_scoped' 
    /app/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.3.2/lib/new_relic/agent/instrumentation/active_record.rb:28:in `log_with_newrelic_instrumentation' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:662:in `exec_query' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1264:in `column_definitions' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:858:in `columns' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/schema_cache.rb:12:in `block in initialize' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `yield' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `default' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `columns' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:237:in `columns_hash' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/delegation.rb:7:in `columns_hash' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:330:in `find_one' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:311:in `find_with_ids' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:107:in `find' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/querying.rb:5:in `find' 
    /app/app/workers/massive_email_sender.rb:5:in `perform' 

이에 따르면, 첫 번째 인수는 이메일 ID이고, 두 번째는 모든 수신자의 목록입니다 : 나는 Resque 나에게주는거야 후 모든 정보를 해요 .

아무도 도와 줄 수 있습니까? 감사!

+0

나는 똑같은 문제가 있습니다. 그것을 해결할 수 있었습니까? – Arkan

+2

내 문제를 해결, 내 솔루션을 찾으려면 내 게시물에 봐, http://stackoverflow.com/questions/9961044/postgres-error-on-heroku-with-resque/9964924#9964924 – Arkan

+0

고마워, Arkan, 그게 효과가있어. – sauronnikko

답변

4

동일한 문제가 발생했습니다. Active Record를 사용한다고 가정 할 때 각 포크 된 Resque 작업자에 대해 ActiveRecord::Base.establish_connection으로 전화하여 부실 데이터베이스 연결이 없는지 확인해야합니다. 이것을 넣어주세요 lib/tasks/resque.rake

task "resque:setup" => :environment do 
    ENV['QUEUE'] = '*' 
    Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection } 
end