레일스 애플리케이션이 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
을하지만 아무런 영향이없는 것으로 보인다
나는 스크립트에이를 추가했습니다.
이상한 것은 내가 이메일을 보내기 위해 만든 스레드 풀을 제거 당신을 지적하고이 문제가 도망 갔어요 . 아직도 이유를 알아 내려고 노력했습니다. – JohnMerlino