分布式系統中的數據訪問設計模式
在大多數具有簡單查詢的單體系統中,所有必要的數據可以在單個數據庫調用中檢索。然而,當數據分散到由不同服務擁有的單獨的數據庫或模式中時,讀操作的數據訪問開始變得困難。

示例
愿望單服務維護客戶可能希望最終購買的項目列表,并包括客戶ID、項目ID和項目添加日期在相應的愿望單表中。目錄服務負責維護公司銷售的所有項目,并包括項目ID、項目描述和靜態產品維度信息,如重量、高度、長度等。

在這個示例中,當客戶請求顯示他們的愿望單時,項目ID和項目描述(item_desc)都會返回給客戶。然而,愿望單服務的表中沒有項目描述;該數據由目錄服務擁有,在提供更改控制和數據所有權的緊密形成的有界上下文中。
服務間通信模式
服務間通信模式是分布式系統中最常見的用于訪問數據的模式。如果一個服務(或系統)需要讀取它無法直接訪問的數據,它只需通過某種遠程訪問協議向擁有該數據的服務或系統請求數據。
請注意,對于每個獲取客戶愿望單的請求,愿望單服務必須進行遠程調用以從目錄服務獲取項目描述。這種模式出現的第一個問題是由于網絡延遲、安全延遲和數據延遲而導致的性能較慢。
- 網絡延遲是到達和從服務的分組傳輸時間。
- 安全延遲發生在需要額外授權才能執行請求的目標服務的端點。
- 數據延遲描述了需要進行多次數據庫調用以檢索傳遞給最終用戶所需信息的情況。

這種模式的另一個重要缺點是服務耦合。因為愿望單必須依賴于目錄服務是否可用,所以這兩個服務在語義上和靜態上都是耦合的,這意味著如果目錄服務不可用,愿望單服務也不可用。此外,由于愿望單服務與目錄服務之間的緊密靜態耦合,愿望單服務隨著需求量的增加而擴展,目錄服務也必須擴展。
列模式復制模式
使用列模式復制模式,列被復制到表格中,從而復制數據并使其可用于其他有界上下文。
數據同步和數據一致性是與列模式復制數據訪問模式相關的兩個最大問題。每當創建產品、從目錄中刪除產品或更改產品描述時,目錄服務必須以某種方式通知愿望單服務(和任何其他復制數據的服務)進行更改。通常,通過使用隊列、主題或事件流進行異步通信來完成這一點。

這種模式的另一個挑戰是很難管理數據所有權。因為數據復制在屬于其他服務的表格中,這些服務可以更新數據,即使它們并沒有正式擁有數據。這反過來又帶來了更多的數據一致性問題。
盡管一般情況下我們警告不要在愿望單服務和目錄服務示例等情況下使用這種數據訪問模式,但在某些情況下可能需要考慮使用它,例如數據聚合、報告或其他數據訪問模式不適合的情況,因為數據量大,響應要求高或容錯要求高。
復制緩存模式
這種模式利用復制的內存緩存,使其他服務所需的數據可用于每個服務,而無需請求它們。復制緩存與其他緩存模型不同,因為數據保留在每個服務的內存中,并持續同步,以便所有服務在任何時候都具有相同的數據。
讓我們與其他緩存模型進行比較,以更好地理解它。單個內存緩存模型是最簡單的緩存形式,其中每個服務都有自己的內部內存緩存。使用這種緩存模型,內存數據在緩存之間不進行同步,這意味著每個服務都有其自己的特定于該服務的唯一數據。盡管這種緩存模型有助于提高每個服務內部的響應性和可伸縮性,但由于缺乏緩存之間的同步,對于共享數據而言并不有用。

在分布式架構中使用的另一種分布式緩存。正如此緩存模型所示,數據不存儲。
在每個服務的內存中,而是存儲在緩存服務器中。服務使用專有協議向緩存服務器發出請求以檢索或更新共享數據。請注意,與單個內存緩存模型不同,數據可以在服務之間共享。

使用復制緩存,每個服務都有自己的內存數據,在服務之間保持同步,允許多個服務之間共享相同的數據。

那么復制緩存是如何工作的呢?為了解決分布式數據訪問問題,讓我們回到愿望單服務和目錄服務的示例。目錄服務擁有產品描述的內存緩存(這意味著它是唯一可以修改緩存的服務),愿望單服務包含相同緩存的只讀內存副本。

有了這種模式,愿望單服務不再需要調用目錄服務以檢索產品描述 — 它們已經在愿望單服務的內存中。當目錄服務對產品描述進行更新時,緩存產品將更新愿望單服務中的緩存以使數據一致。
復制緩存模式的明顯優勢在于響應性、容錯性和可伸縮性。由于服務之間不需要明確的服務間通信,數據隨時在內存中可用,提供了對不擁有數據的服務最快的數據訪問。
這種模式的第一個權衡是與緩存數據和啟動時間相關的服務依賴性。由于目錄服務擁有緩存并負責填充緩存,所以在初始愿望單服務啟動時,目錄服務必須在運行時。如果目錄服務不可用,初始愿望單服務必須進入等待狀態,直到與目錄服務建立連接。
這種模式的第二個權衡是數據量。如果數據量太大(如超過500 MB),則這種模式的可行性會迅速減小,特別是對于需要數據的多個服務的多個實例。
第三個權衡是,如果數據的更改率(更新率)太高,復制緩存模型通常不能在服務之間保持數據完全同步。
總結
- 服務間通信模式:這是最常見的分布式系統中的數據訪問模式,其中一個服務需要讀取其他服務擁有的數據時,通過遠程訪問協議向擁有數據的服務請求數據。然而,這種模式存在性能較慢、服務耦合等問題。
- 列模式復制模式:這個模式涉及將數據列復制到不同的表中,以使數據可用于其他有界上下文。但它面臨數據同步和數據一致性的挑戰,因為數據的更改需要異步通信來通知其他服務,這可能導致數據一致性問題。
- 復制緩存模式:這種模式利用內存緩存,使多個服務能夠共享相同的數據,而無需顯式請求。這提供了高響應性、容錯性和可伸縮性,但也帶來了服務依賴性和數據量等權衡問題。
每種模式都有其適用的場景和權衡,選擇合適的數據訪問模式取決于具體的需求和約束。
































