2014-07-24 2 views
0

레일스 애플리케이션이 50 개인 경우에도 인기있는 데몬 gem을 사용하여 정기적으로 작업을 처리하는 스크립트를 작성했습니다. 이처럼 보이는 것입니다 : 문제는 큐가 축적되도록 항목이 많이 레디 스를 통해 오는 것입니다레일스 애플리케이션에 데이터베이스 연결이 끊어짐

class Responder 
    def initialize 
    @queue = Queue.new 
    end 
    # add to queue 
    def produce(msg) 
    @queue << msg 
    end 

    # take from queue 
    def consume 
    Thread.new do 

     loop do 
     sleep(1) 
     if [email protected]? 
      data = @queue.pop 
      process(data) 
     end 
     end 

    end 
    end 
end 

class EmailResponder < Responder 
    def process(message) 
    Alert.where(id: message[:id]).send_mail 
    end 
end 

class GeocodeResponder < Responder 
    def process(message) 
    Report.where(id: message[:id]).geocode_data 
    end 
end 

class RedisListener 
    def initialize(host,port) 
    @host = host 
    @port = port 
    @email_sms = EmailResponder.new 
    @geocode = GeocodeResponder.new 
    # timeout so we wait for messages forever 
    @redis = Redis.new(:host => @host, :port => @port, :timeout => 0) 
    end 

    def start_producers 
    thread = Thread.new do 
     @redis.subscribe('juggernaut') do |on| 
     on.message do |event, msg| 
      @email_sms.produce(msg) 
      @geocode.produce(msg) 
     end 
     end 
    end 
    end 

    def start_consumers 
     @email_sms.consume 
     @sidekiq.consume 
    end 
end 

    listener = RedisListener.new('127.0.0.1', 6379) 
    listener.start_producers 
    listener.start_consumers 

, 그리고 그것이 PostgreSQL을 최대로 충돌하는 지점에 더 많은 데이터베이스 연결을 사용하게 연결에 도달했습니다. 큐의 크기를 제한하고 싶지 않다면, 즉시 redis를 통해 오는 데이터가 손실 될 위험이 있습니다. 차라리 대기열이 커지면서 커지도록하고 데이터베이스 연결을 실제로 제한하려고합니다. 이 Rails 데몬에서 데이터베이스 연결을 어떻게 제한 할 수 있습니까? (예 : Alert.where (...) 또는 Report.where (...)와 같은 ActiveRecord 객체를 사용하면 db 연결이 해제 될 때까지 차단됩니다)?

ActiveRecord::Base.configurations['production']['pool'] = 10 

을하지만 아무런 영향이없는 것으로 보인다

나는 스크립트에이를 추가했습니다.

답변

0

나는이 주제와 관련이 있다고 생각합니다. 스레드 간의 짧은 활동 기록 캔트 공유 연결 풀에서 Connection pool issue with ActiveRecord objects in rufus-scheduler

def handle_db_pools(&block) 
    ActiveRecord::Base.connection_pool.with_connection &block 
end 

handle_db_pools do 
    Alert.where(id: message[:id]).send_mail 
end 

희망이 올바른 방향

+0

이상한 것은 내가 이메일을 보내기 위해 만든 스레드 풀을 제거 당신을 지적하고이 문제가 도망 갔어요 . 아직도 이유를 알아 내려고 노력했습니다. – JohnMerlino

관련 문제