2012-01-13 1 views
3

Правильно ли это способ объединения пулов Redis с Sinatra Synchrony?Синхронизация Sinatra с соединением пула Redis

Мой Gemfile выглядит следующим образом:

gem 'sinatra-synchrony' 
gem 'hiredis' 
gem 'redis' 

В Sinatra файлы сервера использовать классический подход в стиле, и в целом выглядят так:

require 'sinatra' 
require 'sinatra/synchrony' 
require 'redis/connection/hiredis' 
require 'redis/connection/synchrony' 
require 'redis' 

redis = EventMachine::Synchrony::ConnectionPool.new(size: 5) do 
    Redis.new(path: '/tmp/redis.sock') 
end 

get/do 
    # lots of redis reads and writes 
end 

Я затем запустить несколько экземпляров одного и того же приложения сервера , каждый под другим портом, и используйте nginx для загрузки баланса между ними.

Это подходящее решение для объединения пулов Redis с серверами Sinatra?

ответ

4

Вот рабочий пример, я удалил Sinatra/Синатру, потому что я не чувствую, что это необходимо, и я не мог сделать это работает:

Gemfile:

source :rubygems 

gem 'thin' 
gem 'rack-fiber_pool' 
gem 'hiredis' 
gem 'sinatra' 
gem 'em-synchrony' 
gem 'redis' 

config.ru:

require 'rubygems' 
require 'bundler/setup' 
require 'sinatra/base' 
require 'redis/connection/synchrony' 
require 'redis' 
require 'rack/fiber_pool' 

class App < Sinatra::Base 

    set :template_path, '/tmp' 

    def initialize 
    super 
    @redis = EventMachine::Synchrony::ConnectionPool.new(size: 2) do 
     Redis.new 
    end 
    end 

    get '/' do 
    @redis.multi do |r| 
     r.set('v', "value2") 
     r.set('v2', '43') 
    end 

    @redis.get('v') 
    end 
end 

use Rack::FiberPool 
use Rack::CommonLogger 
run App 

И запустить его (в той же папке):

bundle 
bundle exec thin start 

В реальном приложении вы должны удалить код приложения из файла config.ru и добавить запрос, но по крайней мере он дает вам начало :)

+0

Спасибо за этот кусок кода, но у него есть главный недостаток - I не может муза @ redis.multi {...}, он просто зависает. Я думаю, что это связано с использованием другого соединения для команд запуска end end ... –

+0

Я просто обновил пример, чтобы добавить многократный вызов, он отлично работает для меня. Возможно, вы ошиблись в том, что вам нужно использовать соединение, переданное в качестве аргумента в блок. – Schmurfy