我需要找到一种在rails引擎的帮助下扩展rails monolith应用程序的方法。
目标:I有数据库连接超时问题,monolith有更多的200+模型。我们要做的是把我们的模型分成树状的引擎结构。我们将能够为每个引擎使用一个单独的数据库。
UseCase:,假设我们有引擎A作为基本引擎,它分别包含在引擎B和C中。B和C引擎都生活在树的同一水平上。
所以我在不同的引擎里分了几个型号。
引擎A:拥有与用户相关的所有数据。
Class User
end引擎B:拥有与产品相关的所有数据
class Product
end引擎C:拥有与报表相关的所有数据。
class Report
end现在,在定义关联时,主要问题出现了。早些时候,我们有关联和其他几种访问关联的方法。就像。
class User
has_many products
def get_title_product
products.pluck(:title)
end
end现在我不能在引擎A中定义它,因为products表不在那里。
选项:我所知道的是,我必须在引擎B中打开该用户模型,并在引擎B本身中定义与此域相关的所有关联和get_title_product逻辑。我甚至不能将引擎B包括在引擎A中,因为它会导致循环依赖。
我不想遵循上面的方法,因为它会变得很混乱,而且我的应用程序非常大,另外,我认为它不像rails的最佳实践那样好。
提前谢谢。
发布于 2018-01-10 06:08:37
你的帖子里有很多问题。您的问题涉及数据库切分、rails引擎的体系结构以及超时问题的性能/可伸缩性。
性能/超时
首先,您的超时问题与您建议的模型数量无关。模型的数量对表演没有任何影响。要知道性能问题或瓶颈在哪里,您应该使用监视工具。这是我最喜欢的https://www.rorvswild.com (免责声明:我是作者^_^)。还有其他的竞争对手,多用你喜欢的那个。
对于超时,也许您应该检查一下数据库配置。我们在这里没有足够的信息来深入了解。
数据库切分
这一点一点也不简单,因为当外键不在同一个db中时,您就不能加入和引用外键。这就是为什么你必须仔细选择在哪里切碎你的数据库。理想情况下,这里是你加入最少的地方。这是一项长期的工作,对您的代码基础有重要的影响。堆栈溢出帖子不足以讨论切分。幸运的是,有很多文章和宝石可以帮助你做到这一点。
只需确保您了解可以将负载分散到多个数据库中,但它会在代码基础上付出额外的代价。
对于跨数据库的关系,您不能使用Rails、内置的、has_many等。你必须自己定义关系,或者使用一个创业板来帮助实现这个目标。给你一个主意:
class User
def products
Product.where(user_id: id)
end
endRails引擎
它们很适合构建跨应用程序的可重用特性(http://guides.rubyonrails.org/engines.html)。看来重用不是你的目标。所以恐怕你走错方向了。
如果不想重新打开类,可以使用一个模块:
module HasProducts
def self.included(model)
model.has_many(:products)
end
def get_title_product
products.pluck(:title)
end
endhttps://stackoverflow.com/questions/48180454
复制相似问题