架構模式: 共享數據庫


架構模式: 共享數據庫

上下文

讓我們假設您正在使用微服務架構模式開發在線商店應用程序。大多數服務需要在某種數據庫中保存數據。例如,訂單服務存儲有關訂單的信息,而客戶服務存儲有關客戶的信息。

問題

微服務應用程序中的數據庫體系結構是什么?
 

要點

  • 服務必須松散耦合,以便可以獨立開發,部署和擴展

  • 某些業務事務必須強制執行跨多個服務的不變量。例如,下訂單用例必須驗證新訂單不會超過客戶的信用額度。其他業務事務,必須更新多個服務所擁有的數據。

  • 某些業務事務需要查詢由多個服務擁有的數據。例如,查看可用信用使用必須查詢客戶以查找creditLimit和Orders以計算未結訂單的總金額。

  • 某些查詢必須連接由多個服務擁有的數據。例如,查找特定區域中的客戶及其最近的訂單需要客戶和訂單之間的聯接。

  • 有時必須復制和分割數據庫才能擴展。請參閱比例立方體。

  • 不同的服務有不同的數據存儲要求。對於某些服務,關系數據庫是最佳選擇。其他服務可能需要NoSQL數據庫,例如MongoDB,它擅長存儲復雜的非結構化數據,或Neo4J,用於高效存儲和查詢圖形數據。

結論

使用由多個服務共享的(單個)數據庫。每個服務使用本地ACID事務自由訪問其他服務擁有的數據。

例子

OrderService和CustomerService可以自由訪問彼此的表。例如,OrderService可以使用以下ACID交易,確保新訂單不會違反客戶的信用額度。

BEGIN TRANSACTION
…
SELECT ORDER_TOTAL
 FROM ORDERS WHERE CUSTOMER_ID = ?
…
SELECT CREDIT_LIMIT
FROM CUSTOMERS WHERE CUSTOMER_ID = ?
…
INSERT INTO ORDERS …
…
COMMIT TRANSACTION

即使同時交易試圖為同一客戶創建訂單,數據庫也將保證不會超過信用額度。

結果上下文

這種模式的好處是:

  • 開發人員使用熟悉且直接的ACID事務來強制數據一致性
  • 單個數據庫操作起來更簡單

這種模式的缺點是:

  • 開發時間耦合 - 例如,處理OrderService的開發人員需要與訪問相同表的其他服務的開發人員協調模式更改。這種耦合和額外的協調將減緩發展。

  • 運行時耦合 - 因為所有服務都訪問同一個數據庫,所以它們可能會相互干擾。例如,如果長時間運行的CustomerService事務在ORDER表上保持鎖定,則OrderService將被阻止。

  • 單個數據庫可能無法滿足所有服務的數據存儲和訪問要求。

關聯模式

  • 每個服務數據庫是一種替代方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM