Ruby on rails:如何在许多请求中保持对象存活?

时间:2014-04-17 16:05:56

标签: ruby-on-rails ruby

当用户登录我的网站时,我想打开与另一台服务器的连接。用户对我的服务器的请求将转换为对该服务器的读/写请求。只要用户登录,该服务器的连接对象就应该是活动的,这样我就不需要在每个用户请求上重新连接。

据我了解ruby on rails,一旦请求完成,控制器/助手中的所有对象都会被清除。在用户注销之前,我需要在对不同控制器的许多请求中保持该对象的存活。

架构方面,RoR框架中是否有可以放置此类对象的地方?

3 个答案:

答案 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的辉煌||=运营商。)

编辑:刚才意识到这是每个用户,我可能只是修改我当前的版本,以包含基于存储连接的用户ID的哈希,简单易用,只记得在用户注销时关闭连接或者是闲置太久了。对于一个实际封装它的小类来说,这似乎是一个不错的选择

def server_connection(user)
  @@connection_hash ||= {}
  @@connection_hash[user.id] ||= MyConnectionClass.new(variables, to, set, up, connection, for user)
end