2014-01-13 1 views
0

나는 Heroku에서 실행되는 모듈 식 스타일로 작성된 Sinatra 응용 프로그램을 보유하고 있습니다. Redis를 사용하고 제한된 수의 Redis 연결이 있습니다. Redis 연결이 끊어져서 오류가 발생하는 경우가 종종있었습니다. 그래서 나는 물건을 고칠 수있는 희망으로 connection_pool을 사용하기 시작했습니다. 하나의 Redis 연결 풀과 앱은 각 요청에 대해 새로운 연결을 만들려고하지 않고 그 중 하나를 선택할 것입니다.Sinatra 모듈 식 스타일을 사용하여 요청 당 인스턴스별로 변수 만들기

하지만 여전히 동일한 문제가 있습니다. 불만없이 하나의 쿼리에 많은 수의 Redis 쿼리를 수행 할 수 있습니다. 그러나 몇 번의 Redis 쿼리를 수행하는 단일 테스트 페이지를 몇 차례에 걸쳐 매우 빠르게 연속해서로드하면 "Redis :: CommandError - ERR 최대 클라이언트 도달 수"오류가 다시 발생합니다.

그래서 저는 각 요청마다 connection_pool의 새로운 인스턴스를 생성하고 있다고 가정하고 있습니다 ... 잘 모르겠습니다. 그러나 기대했던대로 "풀링"하지 않습니다.

# myapp.rb 
$LOAD_PATH.unshift(File.dirname(__FILE__)) 
$stdout.sync = true 

require 'thin' 
require 'myapp/frontend' 

MyApp::Frontend.run! 

그리고시나 응용 프로그램 :

나는 이런 종류의 일을

# myapp/frontend.rb 
require 'sinatra/base' 
require 'redis' 
require 'connection_pool' 
require 'uuid' 

module MyApp 
    class Frontend < Sinatra::Base 

    helpers do 
     def redis_pool 
     @redis_pool ||= ConnectionPool.new(:size => 8, :timeout => 5) do 
      redis_uri = URI.parse(ENV['REDISCLOUD_URL']) 
      client = ::Redis.new(:host => redis_uri.host, 
           :port => redis_uri.port, 
           :password => redis_uri.password) 
     end 
     end 
    end 

    get '/tester/' 
     redis_pool.with do |r| 
     id = UUID.generate 
     r.hset(:user, id, "Some data") 
     r.hget(:user, id) 
     r.hdel(:user, id) 
     end 
     p "DONE" 
    end 
    end 
end 

Procfile은 다음과 같습니다

web: ruby myapp.rb 

어떤 아이디어? 현재 사이트는 트래픽이 매우 적으므로 가능해야합니다.

답변

1

도우미 메서드 redis_pool이 매번 호출되기 때문에 /tester/에 대한 가져 오기 요청이 처리 될 때마다 @redis_pool의 새 인스턴스가 만들어집니다.

한 번만 레디 스 연결을 초기화하는시나의 설정 도우미를 사용할 수 있습니다

config do 
    redis_uri = URI.parse(ENV['REDISCLOUD_URL']) 
    set :redis, Redis.new(:host => redis_uri.host, 
         :port => redis_uri.port, 
         :password => redis_uri.password) 
end 

이제 응용 프로그램의 각 인스턴스는 모든 요청에 ​​대해 지속 한 레디 스 연결을 가지고있다. 이렇게 설정에 액세스하십시오

get '/tester/' 
    id = UUID.generate 
    settings.redis.hset(:user, id, "some data") 
    settings.redis.hget(:user, id) 
    settings.redis.hdel(:user, id) 
    p "DONE" 
end 
+0

아, 훌륭합니다, 감사합니다 Lukas! 그건 내 작은 테스트에서 작동하는 것 같습니다. connection_pool을 전혀 사용할 필요가없는 것처럼 보입니다. 어떻게 생각하세요? 하나의 작은 오타 :'setting.redis ...'set.redis ...가 아닙니다. –