【问题标题】:A way to access common FTP connection resource pool in Ruby across AJAX calls?一种跨 AJAX 调用访问 Ruby 中通用 FTP 连接资源池的方法?
【发布时间】:2010-12-17 14:58:42
【问题描述】:

我有一个 Web 应用程序,它与外部服务器建立了许多 FTP 或 SFTP 连接。它的界面使用 AJAX,通过 AJAX 我在远程 FTP 服务器上获取文件列表并将其返回给客户端浏览器。

每次运行 AJAX 调用时,我都必须重新连接到远程服务器并重新进行身份验证。这需要大量额外的时间。

有没有办法以某种方式将 FTP 连接资源对象存储在一些公共内存池中,并在未来的 AJAX 调用中重新访问连接资源对象?我尝试了 Memcached,但似乎无法在其中存储连接资源。也许我可以将它们存储在一个线程中并以某种方式在那里访问它们?还有其他想法吗?

我总是可以让一个守护进程管理连接并充当代理,但这感觉有点过头了。

【问题讨论】:

  • 我回答你的问题了吗...?
  • 不幸的是,我认为这种方法行不通,因为我认为它不允许我保持 FTP 连接池处于活动状态并跨 httpd 进程重新访问它们。不过我可能错了……我还没有到可以编写原型的地步。如果我最终使用您描述的方法,我一定会回到这里并将您的建议标记为答案。不过,我可能最终会使用一个守护进程。
  • 重点是你不需要一个“池”,每个工人只需要一个连接。工作人员一次只处理一个请求,因此只需要 1 个连接。如果您确实需要每个工作人员 2 个连接,您可以简单地在 on_event 处理程序中建立 2 个连接而不是 1 个。 Worker 会停留一段时间,因此只要 Worker 停留,连接就会被重新使用,并且新的 Worker 也会导致新的连接。
  • 投反对票的人是怎么回事?

标签: ajax resources ftp connection


【解决方案1】:

您可以为您拥有的每个工作程序/应用程序进程打开一个连接。例如,有乘客:

if defined?(PhusionPassenger)
  PhusionPassenger.on_event(:starting_worker_process) do |forked|
    if forked
      # connect to ftp server
    end
  end
end

使用 Rails,这将进入 environment.rb

也就是说,我不确定这是否是个好主意,因为我不经常使用 ftp。

【讨论】:

  • 似乎这会为每个 AJAX 调用产生一个新线程,在每个调用中打开一个新连接,对吗?我想要一个存储连接哈希的地方(线程、常用内存池等),并且我想在 AJAX 调用期间重新获得对存储在哈希中的连接的访问​​权限。
  • 不,这会在乘客启动工作人员时连接。工人在请求之间被重用(好吧,无论如何,这里有很多细节可以通过配置来影响,其他的你可以在他们的文档中阅读)。
【解决方案2】:

我最终使用全局变量(例如 $my_global)完成了这项工作。我有一个 ConnectionPooler 单例类,它管理存储在哈希中的连接。很简单。

【讨论】:

  • 为什么投反对票?反馈/解释对我和社区都有好处。仅仅因为某人不喜欢某个解决方案并不意味着它不是一个可行的、体面的解决方案。
猜你喜欢
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 2020-06-09
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多