나는 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
어떤 아이디어? 현재 사이트는 트래픽이 매우 적으므로 가능해야합니다.
아, 훌륭합니다, 감사합니다 Lukas! 그건 내 작은 테스트에서 작동하는 것 같습니다. connection_pool을 전혀 사용할 필요가없는 것처럼 보입니다. 어떻게 생각하세요? 하나의 작은 오타 :'setting.redis ...'set.redis ...가 아닙니다. –