【发布时间】:2014-12-05 20:50:40
【问题描述】:
- 注意:请注意确定这是否是问题的最佳标题/接受建议以编辑未来值 *
我有一个多租户 Rails 应用程序,它允许客户使用他们自己的自定义 TLD。所以我可以:
www.clientA.com
www.clientB.com
www.clientC.com
等等……
无论好坏,我的数据库 (postgres) 都有一个租户表,其中大约有 60 列,每个租户都有各种设置和配置。有些只是标志,有些是大文本值。
在application_controller.rb 中,我有一些逻辑来解析URL,根据域查询租户表并实例化@current_tenant 对象。 @current_tenant 对象在页面的整个生命周期中都可用。这发生在每个。单身的。页。我的应用程序。
虽然我有一些很重的缓存,但这种设计对我来说仍然非常错误,我相信它可以改进。
对此有最佳实践吗?处理 @current_tenant 对象的最佳模式是什么?我担心内存管理。
【问题讨论】:
-
您如何处理 SSL?我认为您会做与子域类似的事情。看看这个 railscast。 railscasts.com/episodes/221-subdomains-in-rails-3
-
只要有 ssl,TLD 域就会更改为具有通配符 SSL 的 clientname.myappdomain.com。在那种情况下,我仍在查找并加载 @current_tenant 对象。
-
我认为答案取决于您使用的服务器类型。例如,Passenger 可能会为每个子域创建单独的进程。如果您使用 Nginx 作为 Puma 或 Unicorn 的代理,您可以将每个请求引导到同一个应用程序实例,这将更容易共享内存访问。我不确定您要缓存什么样的东西(复杂的对象或只是一些字符串来配置您的应用程序等 - 也许一些代码示例会有所帮助),但更通用的方法是使用 Memcached 或Redis 在实例之间共享您的缓存值。
-
我正在使用 Unicorn(在 Heroku 上)。我想我的问题/担心是我在每个页面请求上加载 @current_tenant 对象,它上面有大约 60 个属性、一些标志、一些大文本值。是否有处理此类问题的最佳做法?
标签: ruby-on-rails postgresql design-patterns activerecord architecture