#ruby #heroku #sinatra #puma #sequel
Вопрос:
Мое приложение в Heroku с Ruby Sinatra puma продолжение в порядке, в то время как рабочий процесс = 1 при увеличении рабочего процесса = 2 или при увеличении dyno = 2 я начинаю с проблем случайной потери сеанса пользователя в разных точках системы, что очень затрудняет поиск конкретной ошибки в журналах heroku.
То же приложение отлично работает с:
Но вы теряете значение сеанса[: пользователь] с:
Моя стойка для приложений класс синатры:
class Main <Sinatra :: Aplicación
use Rack :: Session :: Pool
set: protection ,: except =>: frame_options
def usuarioLogueado?
if defined?( session[:usuario] )
if session[:usuario].nil?
return false
else
return true
end
else
return false
end
end
get "/" do
if usuarioLogueado?
redirect "/app"
.....
else
redirect "/home"
end
end
end
Моя связь с продолжением:
pool_size = 10
@ db = Sequel.connect (strConexion ,: max_connections => pool_size )
@ db.extension (: connection_validator)
@ db.pool.connection_validation_timeout = -1
Мой puma.rb: (20 подключений макс. ДБ)
workers Integer (ENV ['WEB_CONCURRENCY'] || 1)
threads_count = Integer (ENV ['MAX_THREADS'] || 10)
threads threads_count, threads_count
preload_app!
rackup DefaultRackup
port ENV ['PORT'] || 3000
Ответ №1:
Rack::Session::Pool
это простое хранилище сеансов на основе памяти. Каждый процесс имеет свое собственное хранилище, и они не являются общими для процессов или хостов. Когда запрос направляется в другой динамический модуль или другой процесс в том же динамическом модуле, данные сеанса будут недоступны.
Вы можете посмотреть на липкие сеансы, но они не будут работать во всех ситуациях (например, при создании или уничтожении динамических систем) и вообще не будут работать, если у вас несколько процессов в одном динамическом процессоре.
Вам следует подумать об использовании сеансов на основе файлов cookie или настроить общее хранилище на стороне сервера, такое как memcached с Dalli, чтобы не имело значения, к какому динамо или процессу направляется каждый запрос.
Комментарии:
1. по сути, проблема заключалась в том, что Rack :: Сессия :: Пул переключился на стойку :: Сессия :: EncryptedCookie, и это было исправлено Большое спасибо, Мэтт, ты мне очень помог