分散式系統中的解耦模式:領域查詢 - mathiasverraes

banq發表於2019-05-12

使用領域查詢替換普通自由查詢可以將業務知識從伺服器內部分離出來。

問題

查詢通常與資料庫查詢相關聯。然而,我們可以通過其他方式查詢不是資料庫的系統,比如查詢REST和GraphQL等API。自由查詢這個術語是指使用豐富的查詢語言,可以非常自由地訪問和組合來自這些系統的資料。

在由單個團隊擁有的單個客戶端和伺服器的非常簡單的環境中,這不是一個大問題,因為可以同時針對伺服器和客戶端進行修改。

但是在更復雜的環境中,幾個客戶端卻並不在伺服器團隊的控制之下,比如一個公共API。我們不知道他們將向我們傳送什麼查詢,因此保證API向後相容性的唯一方法是保持模式不變。當然,我們可以記錄查詢,但這並不能保證在客戶端中隱藏有尚未傳送的查詢。

比如客戶端傳送以下自由查詢:

SELECT *
FROM Cars AS c
INNER JOIN LeasingContracts AS lc ON c.CarId = lc.CarId
WHERE c.RegistrationYear = 2014;

僅從SQL查詢中無法搞清楚其目的是什麼?據推測,客戶端並非使用這兩個表中的所有欄位,如果為這個客戶端專門建立一個資料表結構,提供其所需的欄位,這樣可能會有表結構的破壞性風險。

解決

經過進一步調查得知客戶其實想要知道哪些車輛需要更換?並使用一些LeasingContracts欄位來計算狀態。

因此,針對這種情況,更好的設計是關閉對資料庫欄位的所有訪問,並使用自然語言提供領域查詢。伺服器獲取並計算結果,響應訊息僅包含客戶端實際需要的資料。

WhichCarsAreUpForReplacement : Query {
  registrationYear: 2014
}

CarsThatAreUpForReplacement : Response {
   cars: [CarId] 
}

 

相關文章