【问题标题】:I lose user session with Ruby + Sinatra + puma + sequel only when worker process puma> 1仅当工作进程 puma> 1 时,我才失去与 Ruby + Sinatra + puma + sequel 的用户会话
【发布时间】:2021-08-17 01:21:00
【问题描述】:

我在 Heroku 中使用 Ruby + Sinatra + puma + sequel 的应用程序是可以的,而工作进程 = 1 当增加工作进程 = 2 或如果增加 dyno = 2 我从系统中不同点随机丢失用户会话的问题开始使得通过heroku日志定位具体错误变得非常困难。

相同的应用程序适用于:

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

我的 app rack sinatra 类:

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 个连接 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

【问题讨论】:

    标签: ruby heroku sinatra puma sequel


    【解决方案1】:

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

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

    您应该考虑使用cookie based sessions,或者使用Dalli 设置共享服务器端存储,例如memcached,这样每个请求被路由到哪个dyno 或进程都没有关系。

    【讨论】:

    • 实际上问题是 Rack :: Session :: Pool 切换到 Rack :: Session :: EncryptedCookie 并已修复 非常感谢 matt,你帮了大忙
    猜你喜欢
    • 2013-03-22
    • 2021-01-14
    • 2017-06-01
    • 2017-08-23
    • 2021-12-09
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多