Я теряю сеанс пользователя с Ruby Sinatra puma продолжение только тогда, когда рабочий процесс puma> 1

#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, и это было исправлено Большое спасибо, Мэтт, ты мне очень помог