首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails引擎可伸缩性问题

Rails引擎可伸缩性问题
EN

Stack Overflow用户
提问于 2018-01-10 04:45:16
回答 1查看 308关注 0票数 1

我需要找到一种在rails引擎的帮助下扩展rails monolith应用程序的方法。

目标:I有数据库连接超时问题,monolith有更多的200+模型。我们要做的是把我们的模型分成树状的引擎结构。我们将能够为每个引擎使用一个单独的数据库。

UseCase:,假设我们有引擎A作为基本引擎,它分别包含在引擎B和C中。B和C引擎都生活在树的同一水平上。

所以我在不同的引擎里分了几个型号。

引擎A:拥有与用户相关的所有数据。

代码语言:javascript
复制
Class User 
end

引擎B:拥有与产品相关的所有数据

代码语言:javascript
复制
class Product
end

引擎C:拥有与报表相关的所有数据。

代码语言:javascript
复制
class Report
end

现在,在定义关联时,主要问题出现了。早些时候,我们有关联和其他几种访问关联的方法。就像。

代码语言:javascript
复制
class User
  has_many products

  def get_title_product
    products.pluck(:title)
  end
end

现在我不能在引擎A中定义它,因为products表不在那里。

选项:我所知道的是,我必须在引擎B中打开该用户模型,并在引擎B本身中定义与此域相关的所有关联和get_title_product逻辑。我甚至不能将引擎B包括在引擎A中,因为它会导致循环依赖。

我不想遵循上面的方法,因为它会变得很混乱,而且我的应用程序非常大,另外,我认为它不像rails的最佳实践那样好。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-01-10 06:08:37

你的帖子里有很多问题。您的问题涉及数据库切分、rails引擎的体系结构以及超时问题的性能/可伸缩性。

性能/超时

首先,您的超时问题与您建议的模型数量无关。模型的数量对表演没有任何影响。要知道性能问题或瓶颈在哪里,您应该使用监视工具。这是我最喜欢的https://www.rorvswild.com (免责声明:我是作者^_^)。还有其他的竞争对手,多用你喜欢的那个。

对于超时,也许您应该检查一下数据库配置。我们在这里没有足够的信息来深入了解。

数据库切分

这一点一点也不简单,因为当外键不在同一个db中时,您就不能加入和引用外键。这就是为什么你必须仔细选择在哪里切碎你的数据库。理想情况下,这里是你加入最少的地方。这是一项长期的工作,对您的代码基础有重要的影响。堆栈溢出帖子不足以讨论切分。幸运的是,有很多文章和宝石可以帮助你做到这一点。

只需确保您了解可以将负载分散到多个数据库中,但它会在代码基础上付出额外的代价。

对于跨数据库的关系,您不能使用Rails、内置的、has_many等。你必须自己定义关系,或者使用一个创业板来帮助实现这个目标。给你一个主意:

代码语言:javascript
复制
class User
  def products
    Product.where(user_id: id)
  end
end

Rails引擎

它们很适合构建跨应用程序的可重用特性(http://guides.rubyonrails.org/engines.html)。看来重用不是你的目标。所以恐怕你走错方向了。

如果不想重新打开类,可以使用一个模块:

代码语言:javascript
复制
module HasProducts
  def self.included(model)
    model.has_many(:products)
  end

  def get_title_product
    products.pluck(:title)
  end
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48180454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档