Синатра Синхронизация с пулом подключений Redis - PullRequest
3 голосов
/ 13 января 2012

Это правильный способ обработки пула соединений Redis с помощью Sinatra Synchrony ?

Мой гемфайл выглядит так:

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?

1 Ответ

4 голосов
/ 16 января 2012

Вот рабочий пример, я удалил sinatra / 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

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

* * 1010

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

...