Синхронность Синатра с подключение к Redis для объединения


Является ли это правильным способом обработки пула соединений 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 3

1 ответ:

Вот рабочий пример, я удалил Синатру/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 файл и добавить требование, но по крайней мере это дает вам старт :)