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