仅当工作进程 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 或进程都无关紧要。
我在 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 或进程都无关紧要。