針對 SaaS 應用程式的基於 Hibernate 架構的資料庫分區
SaaS 正在改變設計、構建、部署和操作應用程式的方式。開發一個 SaaS 應用程式與開發一個通用公司專屬應用程式程式之間的關鍵區別在於,SaaS 應用程式必須是多租戶的。其他關鍵 SaaS 需求,比如安全性、定製、面向服務的架構(SOA)和整合,也影響 SaaS 應用程式架構。
多租戶是指應用程式在單一程式碼程式庫內寄存多個承租者並共用資料庫等架構的能力。有多種設計選項可啟用多租戶資料架構 — 每個承租者的專用資料庫、每個承租者的共用資料庫獨立模式,以及所有承租者的片段資料庫共用模式。一種經濟高效的策略是,為所有承租者採用一種共用資料庫和共用模式策略。採用這種方法會對資料庫伸縮帶來重大挑戰,因為資料庫在 SaaS 應用程式支援的所有承租者之間共用。一種簡單的方法是基於承租者 ID、通過資料庫分區橫向擴充共用資料庫。
資料庫分區 是指對資料庫進行水平資料分割,其中每個分區稱為一個片段。有一些開源以及專用軟體,比如 Hibernate Shards、Apache Slice、SQLAlchemy ORM 和 dbShards,可提供分區功能。本文將 Hibernate 作為 J2EE 空間中最常用的 ORM 架構。我們將使用 Hibernate Shards(Hibernate 的一個擴充)解決 SaaS 應用程式的資料庫擴充問題,並向 Hibernate 使用者提供分區的功能。
SaaS 應用程式的資料庫分區
SaaS 應用程式採用一種共用資料庫,共用模式的方法,其設計考慮因素在於,當它不能再滿足基本效能指標時就需要予以伸縮 — 例如,當太多使用者嘗試同時訪問資料庫時,或資料庫的大小會導致查詢和更新的執行時間太長。橫向擴充共用資料庫的一種方式是資料庫分區。這是橫向擴充資料庫最有效方式,因為根據承租者 ID,一個共用模式中的行對於不同承租者是不同的。可以基於承租者 ID 輕鬆地對資料庫進行水平資料分割。從而便於將屬於每個承租者的資料移動到單個分區。
在對多租戶 SaaS 應用程式進行資料分區時,我們需要考慮這樣的因素,比如因並發使用者數量的增多而導致效能降低,或因多個承租者的配置而增加資料庫大小,從而影響現有資料庫的效能特徵。這將有助於您根據單個承租者的資料庫大小需求或同時訪問資料庫的單個承租者的使用者數來選擇合適的分區技術。資料庫分區提供許多優勢,比如對資料庫的更快讀寫、改進的搜尋響應、更小的表格尺寸以及對錶格的按需分配。
Hibernate 資料庫分區可用於構建採用其他多租戶資料架構選項的 SaaS 應用程式,比如每個承租者的專用資料庫,或每個承租者的共用資料庫獨立模式。Hibernate 資料庫分區可以基於承租環境將串連到多個資料庫的應用程式代碼抽取出來,方法就是提供中繼資料配置並進行 API 分區,即根據承租環境處理插入資料的操作和從多個資料庫中讀取資料的操作。
使用 Hibernate Shards 實現分區
Hibernate Shards 是一個旨在通過向 Hibernate Core 添加水平資料分割支援來封裝和最小化這種複雜性的架構。它最小化處理片段資料的實現複雜性。Hibernate Shards 的主要目標是讓應用程式使用標準 Hibernate Core API 查詢和辦理共用資料集。該方法具有以下優勢:
提供非侵入性解決方案來支援資料庫分區,同時使用 Hibernate 構建現有 SaaS 應用程式。
允許使用 Hibernate、但尚不需要分區的 SaaS 應用程式採用解決方案,而無需重大重構,前提是它們確實達到了這個階段。
Hibernate Shards 提供:
Hibernate Core 提供片段感知的介面擴充,因此代碼不需要知道它是在與一個分區資料集互動。充當分區引擎的片段感知擴充如下所示:
org.hibernate.shards.ShardedSessionFactory
org.hibernate.shards.criteria.ShardedCriteria
org.hibernate.shards.session.ShardedSession
org.hibernate.shards.query.ShardedQuery
實現特定於應用程式的分區策略的介面。上面描述的分區引擎使用應用程式提供的分區策略。
org.hibernate.shards.strategy.access.ShardAccessStrategy — 通過該策略,Hibernate 決定如何跨多個片段應用程式資料庫操作。每執行一次查詢,都會引用該策略。兩個預設實現 SequentialShardAccessStrategy 和 ParallelShardAccessStrategy 已經提供。
org.hibernate.shards.strategy.resolution.ShardResolutionStrategy — 該策略用於決定給定 ID 的對象所在的片段集。片段解析與 ID 產生相聯,Hibernate 為 ID 產生提供多種策略,比如本地、應用程式級 UUID 產生和分布式 hilo 產生。
org.hibernate.shards.strategy.selection.ShardSelectionStrategy — 該策略允許我們決定建立新對象所在的片段。基於應用程式的需求,我們決定該介面的實現。儘管 Hibernate 最初提供一個開箱即用的迴圈實現,我們需要為基於 SaaS 的應用程式提供基於承租者 ID 的實現。