Rails通过所有乘客线程重新加载路线

时间:2014-05-28 20:40:56

标签: ruby-on-rails passenger

我有一个Redirect模型,允许管理员在他们意外通过电子邮件发送错误的路由时构建替换路由。例如,/ documents / 40意外删除了,但他们通过电子邮件将其作为链接发送出去,因此建立一个从/ documents / 40到/ documents / 41的重定向。

代码工作正常,大部分魔法都在路径文件中:

Tenant.includes(:redirects).each do |tenant|
  constraints(subdomain: tenant.domain[0...tenant.domain.index('.')]) do
    tenant.redirects.each do |redirect|
      get redirect.old_path, to: 'redirects#show', id: redirect.id
    end
  end
end

这很好用。当您尝试创建,更新或销毁Redirect类的实例时,会出现此问题。在RedirectsController我已经得到它以便执行:

Platform::Application.reload_routes!

当只有一个Passenger进程在运行时,哪个效果很好。但是,在生产中,我们有超过8个进程在给定时间运行,因此此reload_routes!调用仅影响一个进程。

有没有人知道如何在重启Passenger之前重新加载所有Passenger进程中的路由?

2 个答案:

答案 0 :(得分:1)

如果要在进程之间共享数据,请使用适用于该任务的层,例如memcached,redis或数据库。

Phusion Passenger可能会产生多个应用程序进程。每个进程都有自己的内存,无法访问其他进程的内存。如他的架构所述:

http://www.modrails.com/documentation/Architectural%20overview.html#spawn_server

答案 1 :(得分:0)

我们终于找到了解决方案。我们使用线程的本质来保持多个请求的状态,并创建一个中间件,只要Platform::Application.reload_routes!中保存的时间戳与最后一个路由更改的时间戳不匹配,就会强制当前线程运行Thread.current

请在此处查看完整代码:

Rails reload dynamic routes on multiple instances/servers