數據的原子插入我有3個服務A,B,C.在微服務架構+的NoSql數據庫[微服務體系結構的數據一致性]
服務A接收到來自客戶機的請求。然後A爲其自己的數據庫,服務B和C準備一個數據。基本上A是coo-ordinator。
- 在其數據庫中的插入數據
如果是成功
- 交請求B的數據到服務B和B插入數據在其DB
- 然後發送請求C的數據到服務C和C在其DB中插入數據
一
假設C被插入數據(正在進行中),在此期間,一些讀A數據庫上的查詢R讀取插入的數據。幾毫秒後,C未能插入,但R已經讀取了即將恢復的錯誤數據。
二,
如果服務C數據插入失敗,並且服務B有應用程序服務器停機時間,那麼它將無法恢復?
如果是成功
如果在任何步驟失敗,我們必須恢復所有插入的數據。
我正在使用Cassandra NoSQL DB。
現在我需要的所有情況的通用解決方案,可能會發生這樣的:
在這種情況下該怎麼辦? - >更改數據庫設計,使這種情況永遠不會發生?
這聽起來像是挺解決問題!您可以在Cassandra中批量操作,但要注意它可能會降低性能:https://docs.datastax。COM/EN/CQL /最新/ CQL/cql_using/useBatch.html。考慮如何更新數據並對數據進行建模可能會更容易,試圖使您的更新變得更加冪級,並以這種方式構建事物,而不是闖入「服務」 – markc
@markc服務已被創建,並且它們有嚴格的數據訪問規則。所以,我留下的選擇只是我想的改變數據模型。 – Shubham
如下面的答案中提到的LWT是這裏的一個選項。聽起來這些服務之間確實有一些聯繫,因爲他們似乎知道以前的成功更新。然而,CAS(比較和設置)操作可能會非常迅速地變得非常昂貴。我會建議的一件事是確保你測試一個你達到滿意的解決方案。我不能強調這是多麼重要。我看到系統失敗的次數只有在縮小時纔會失效 - 我已經失去了計數! – markc