簡體   English   中英

Rails Engines可伸縮性問題

[英]Rails Engines scalability issue

我需要找到一種在rails引擎的幫助下擴展我的rails monolith應用程序的方法。

目標:我有數據庫連接超時問題,Monolith具有200多個模型。 我們要做的就是將我們的模型分成樹狀的引擎結構。 而且我們將能夠為每個引擎使用單獨的數據庫。

用例:假設我們有引擎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中定義它,因為產品表不存在於那里。

選項:我所知道的是,我必須在引擎B中打開該用戶模型,並在引擎B本身中定義與此域相關的所有關聯和get_title_product邏輯。 我什至不能將Engine B包含在Engine A中,因為它將導致循環依賴。

我不想遵循上述方法,因為它會變得凌亂並且我的應用程序很大,此外,按照Rails的最佳實踐,我也不認為這是好方法。

提前致謝。

您的帖子包含許多問題。 您詢問有關數據庫分片,具有Rails引擎的體系結構以及具有超時問題的性能/可伸縮性的信息。

表演/超時

首先,您的超時問題與您建議的型號數量無關。 型號數量對性能完全沒有影響。 要了解性能問題或瓶頸在哪里,您應該使用監視工具。 這是我最喜歡的 https://www.rorvswild.com (免責聲明:我是作者^ _ ^)。 還有其他競爭對手,請更多使用您喜歡的一個。

對於超時,也許您應該檢查一下數據庫配置。 我們沒有足夠的信息來深入了解。

數據庫分片

這根本不是一件容易的事,因為當它們不在同一數據庫中時,您無法聯接和引用外鍵。 因此,您必須仔細選擇將數據庫分片的位置。 理想情況下,這里的聯接最少。 這項工作很長,對您的代碼庫有重要影響。 堆棧溢出文章不足以談論分片。 幸運的是,有很多文章和寶石可以幫助您。

只需確保您了解可以將負載分散到許多數據庫中即可,但這會給代碼庫帶來額外的費用。

對於跨數據庫的關系,您不能使用Rails內置的has_many等。 您必須自己定義關系,或者使用寶石將對此有所幫助。 給您一個想法:

class User
  def products
    Product.where(user_id: id)
  end
end

Rails引擎

它們對於在整個應用程序中構建可重用的功能非常有用( 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
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM