仅当工作进程 puma> 1 时,我才失去与 Ruby + Sinatra + puma + sequel 的用户会话

I lose user session with Ruby + Sinatra + puma + sequel only when worker process puma> 1

我在 Heroku 中使用 Ruby + Sinatra + puma + sequel 的应用程序正常,而工作进程 = 1 当增加工作进程 = 2 或者如果增加 dyno = 2 我开始遇到丢失的问题用户会话在系统中的不同点随机进行,因此很难通过 heroku 日志定位特定错误。

同一应用适用于:

但是你丢失了 session[: user] 的值:

我的应用程序架 sinatra class:

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

我的 sequel 联系人:

pool_size  = 10
@ db = Sequel.connect (strConexion ,: max_connections => pool_size )
@ db.extension (: connection_validator)
@ db.pool.connection_validation_timeout = -1

我的 puma.rb:(最多 20 个连接 DB)

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

Rack::Session::Pool 是一个简单的基于内存的会话存储。每个进程都有自己的存储,它们不在进程或主机之间共享。当请求指向不同的测力计或同一测力计上的不同进程时,会话数据将不可用。

您可以查看 sticky sessions,但它们并非在所有情况下都有效(例如,创建或销毁测功机时),如果您在单个测功机上有多个进程,则它们根本不起作用。

您应该考虑使用 cookie based sessions, or set up a shared server side store such as memcached with Dalli,这样每个请求被路由到哪个 dyno 或进程都无关紧要。