当用户登录我的网站时,我想打开与另一台服务器的连接。用户对我的服务器的请求将转换为对该服务器的读/写请求。只要用户登录,该服务器的连接对象就应该是活动的,这样我就不需要在每个用户请求上重新连接。
据我了解ruby on rails,一旦请求完成,控制器/助手中的所有对象都会被清除。在用户注销之前,我需要在对不同控制器的许多请求中保持该对象的存活。
架构方面,RoR框架中是否有可以放置此类对象的地方?
答案 0 :(得分:2)
基本上,我认为你的问题的答案是否定的。有一些方法可以在请求之间为用户存储“基本”数据,无论是在数据库中,在memcache中还是在redis中或类似的东西中,但所有这些都最适合于可以干净地序列化的数据:数字,字符串,可能存储的日期作为字符串。但是,任何类型的网络连接都无法在请求之间可靠地序列化和反序列化,无论是数据库还是其他网络资源(如外部Web服务)。
在不知道您想要保持打开的连接类型的任何细节的情况下,我认为您每次只需从rails向该服务发出新请求就可能会更好。如果这是一个很长的请求,你可以做的一件事就是在后台进程中执行这些请求。然后,Web客户端JS代码将发出初始请求,获取请求ID,然后每隔几秒使用请求ID ping rails应用程序,以查看响应是否已准备就绪。准备好后,它可以读取响应等。这不会减少发出请求和获得响应的总时间,但它可以使页面对用户的响应更快。
答案 1 :(得分:1)
gem'connection_pool'运作良好。
https://github.com/mperham/connection_pool
它允许您跨客户端池分发连接。
您可以创建初始化文件,在该文件中创建10个客户端以分发连接/工作。 的配置/初始化/ connections.rb 强>
$conn_pool = ConnectionPool::Wrapper.new(size: 10, timeout: 3) {
MyConnectionClass.new(my_conn_variables)
}
你可以在你的代码中使用它。
应用/助手/ my_helper.rb 强>
$conn_pool.send_to_my_server()
答案 2 :(得分:0)
我倾向于使用一个辅助函数,它具有一个类或者等于设置连接的类级方法,例如
def server_connection
@@connection ||= MyConnectionClass.new(variables, to, set, up, connection)
end
死亡简单,现在您可以在会话期间保持连接并设置它(如果尚未设置)(使用ruby的辉煌||=
运营商。)
def server_connection(user)
@@connection_hash ||= {}
@@connection_hash[user.id] ||= MyConnectionClass.new(variables, to, set, up, connection, for user)
end