Ruby on rails 是维持多个",;网站“;使用相同的;网络应用程序;值得增加架构和代码复杂性吗?

Ruby on rails 是维持多个",;网站“;使用相同的;网络应用程序;值得增加架构和代码复杂性吗?,ruby-on-rails,architecture,Ruby On Rails,Architecture,这在一开始看起来可能不像是一个与代码相关的问题。但它最终确实是一个非常高级的体系结构问题,它对数据库设计和代码体系结构都有影响。所以,请在判断这是离题之前好好考虑一下 我想我的情况在这个行业并不独特,我想从别人的经验中学习 我经营一个基于主题的视频教育网站已经8年了。最近我受到启发,创建了一个或两个本质上相同但主题不同的网站。我已经拥有这些新网站所需的一切,包括搜索、索引、外部内容托管、后端作业、邮件等 我面临着这样一个决定:我是否要为每一个额外的网站提供当前的网站,并进行所需的5%的更改,以及

这在一开始看起来可能不像是一个与代码相关的问题。但它最终确实是一个非常高级的体系结构问题,它对数据库设计和代码体系结构都有影响。所以,请在判断这是离题之前好好考虑一下

我想我的情况在这个行业并不独特,我想从别人的经验中学习

我经营一个基于主题的视频教育网站已经8年了。最近我受到启发,创建了一个或两个本质上相同但主题不同的网站。我已经拥有这些新网站所需的一切,包括搜索、索引、外部内容托管、后端作业、邮件等

我面临着这样一个决定:我是否要为每一个额外的网站提供当前的网站,并进行所需的5%的更改,以及设置所有其他服务,等等?或者我会尝试将一些“网站”塞进同一个应用程序中,基本上关闭域名并给出不同的外观和内容(以及注册、购物车、菜单、内容等)

这个问题的一个例子是堆栈溢出本身。他们有许多网站的“品牌”略有不同。他们是为每个应用程序维护单独的应用程序,还是只运行一个应用程序? 在第一种情况下,升级和代码开发将失去同步,成为一场噩梦,而在第二种情况下,这将增加相当程度的复杂性,嗯,几乎所有事情

两个看起来都很糟糕。哪一个最不坏

顺便说一句,这是一个RubyonRails应用程序,以防万一,一些宝石存在于我不知道的这类东西中

您看到的是多个“租户”使用单个应用程序的能力

现代术语将其命名为“云”软件,尽管我们当前的HTTP体系结构阻止用户维护状态,阻止其实现该功能


CMS

就你的应用程序而言,你会从阅读相关信息中获益

具体地说,像
tumblr
etc这样的应用程序可以使用您想要的模式——单个应用程序可以使用

  • 行政区
  • 前端
  • 定制(背景图像、样式等)
  • 使用者
--

对于Rails,您可以使用以下结构创建应用程序的单个实例:

#config/routes.rb
scope constraints: AccountCheck do
   resources :posts, path: "" #-> url.com/
end

#lib/account_check.rb
module AccountCheck

    def initializer(router)
        @router = router
    end

    def self.matches?(request)
        Account.exists?(request.subdomain) && request.subdomain
    end

end
--


Gem

非常简单的示例,希望能向您展示如何实现多租户方面

如果您想更深入地了解这一点,您应该看看
帐户
模型周围的数据范围。这不能在除
pgsql
之外的任何其他系统的数据库级别上完成;有一个叫做管理的宝石

这是我目前为止最好的一次。有一本关于此模式的好书-

介绍了多个“租户”使用单个应用程序的能力

现代术语将其命名为“云”软件,尽管我们当前的HTTP体系结构阻止用户维护状态,阻止其实现该功能


CMS

就你的应用程序而言,你会从阅读相关信息中获益

具体地说,像
tumblr
etc这样的应用程序可以使用您想要的模式——单个应用程序可以使用

  • 行政区
  • 前端
  • 定制(背景图像、样式等)
  • 使用者
--

对于Rails,您可以使用以下结构创建应用程序的单个实例:

#config/routes.rb
scope constraints: AccountCheck do
   resources :posts, path: "" #-> url.com/
end

#lib/account_check.rb
module AccountCheck

    def initializer(router)
        @router = router
    end

    def self.matches?(request)
        Account.exists?(request.subdomain) && request.subdomain
    end

end
--


Gem

非常简单的示例,希望能向您展示如何实现多租户方面

如果您想更深入地了解这一点,您应该看看
帐户
模型周围的数据范围。这不能在除
pgsql
之外的任何其他系统的数据库级别上完成;有一个叫做管理的宝石


这是我目前为止最好的一次。有一本关于这种模式的好书-

如果功能相同,那么您只需要一个应用程序。但是,如果您意识到在某一点上应用程序的功能正在分化,那么您可以添加另一个应用程序来处理分化的代码,但保留通用应用程序来处理所有通用功能并转换为面向服务的体系结构。
分叉和维护两组相同的代码是一个应该避免的噩梦。

如果功能相同,那么您只需要一个应用程序。但是,如果您意识到在某一点上应用程序的功能正在分化,那么您可以添加另一个应用程序来处理分化的代码,但保留通用应用程序来处理所有通用功能并转换为面向服务的体系结构。
分叉和维护两组相同的代码是一个应该避免的噩梦。

如果您完全控制了所有站点的“创作方向”,那么在单个站点下维护所有这些代码会更容易


如果您计划保留一个主站点,而对其他站点的更新频率较低,则将它们分开将具有减少耦合的优势-您可以安全地为单个站点/应用程序执行自定义,而不会影响其他站点/应用程序,并避免(进一步)提高所需的总体代码复杂度,以适应同一站点下多个应用程序的竞争需求。

如果您完全控制所有站点的“创意方向”,那么将所有应用程序维护在单个站点下会更容易

如果您计划保留一个主站点,而对其他站点的更新频率较低,则将它们分开将具有减少耦合的优势-您可以安全地为单个站点/应用程序执行自定义,而不会影响其他站点/应用程序,并避免(进一步)提高总体性能
#app/controllers/posts_controller.rb
class PostsController < ApplicationController
   def index
       @account = Account.find_by name: request.subdomain
       @posts   = @account.posts
   end
end