2017-06-27 204 views
0

數據的原子插入我有3個服務A,B,C.在微服務架構+的NoSql數據庫[微服務體系結構的數據一致性]

服務A接收到來自客戶機的請求。然後A爲其自己的數據庫,服務B和C準備一個數據。基本上A是coo-ordinator。

  1. 在其數據庫中的插入數據

如果是成功

  • 交請求B的數據到服務B和B插入數據在其DB
  • 如果是成功

  • 然後發送請求C的數據到服務C和C在其DB中插入數據
  • 如果在任何步驟失敗,我們必須恢復所有插入的數據。

    我正在使用Cassandra NoSQL DB。

    現在我需要的所有情況的通用解決方案,可能會發生這樣的:

    • 假設C被插入數據(正在進行中),在此期間,一些讀A數據庫上的查詢R讀取插入的數據。幾毫秒後,C未能插入,但R已經讀取了即將恢復的錯誤數據。

    在這種情況下該怎麼辦? - >更改數據庫設計,使這種情況永遠不會發生?

    • 二,

      如果服務C數據插入失敗,並且服務B有應用程序服務器停機時間,那麼它將無法恢復?

    +0

    這聽起來像是挺解決問題!您可以在Cassandra中批量操作,但要注意它可能會降低性能:https://docs.datastax。COM/EN/CQL /最新/ CQL/cql_using/useBatch.html。考慮如何更新數據並對數據進行建模可能會更容易,試圖使您的更新變得更加冪級,並以這種方式構建事物,而不是闖入「服務」 – markc

    +0

    @markc服務已被創建,並且它們有嚴格的數據訪問規則。所以,我留下的選擇只是我想的改變數據模型。 – Shubham

    +0

    如下面的答案中提到的LWT是這裏的一個選項。聽起來這些服務之間確實有一些聯繫,因爲他們似乎知道以前的成功更新。然而,CAS(比較和設置)操作可能會非常迅速地變得非常昂貴。我會建議的一件事是確保你測試一個你達到滿意的解決方案。我不能強調這是多麼重要。我看到系統失敗的次數只有在縮小時纔會失效 - 我已經失去了計數! – markc

    回答

    0

    您可以對此使用批量查詢。 yaml文件中有一個參數用於配置批處理大小。 batch_size_fail_threshold_in_kb:50是默認值。

    0

    如果您的服務是完全獨立的,那麼在使用cassandra時將會很困難。您正在使用自己的數據存儲要求圍繞這三項服務進行交易。

    卡桑德拉僅支持由它自己的輕量級交易 - 看到http://docs.datastax.com/en/cassandra/3.0/cassandra/dml/dmlLtwtTransactions.html

    你可以去實現自己的2階段提交: https://en.wikipedia.org/wiki/Two-phase_commit_protocol https://en.wikipedia.org/wiki/Paxos_(computer_science)

    +0

    如何爲MSA + NoSql DB實現2PC。 據我所知,正常的2PC持有隊列資源,直到它完成或中止。 但是在NoSql中沒有鎖。有沒有解決方法? – Shubham

    +1

    我想到的一個想法是跟蹤服務中的每個主鍵和數據中的字段的狀態,以及使用回調和超時。 – Mandraenke

    +0

    @Mandraenke好點; LWT是一種選擇,但CAS操作雖然在Cassandra中受支持,但可能會導致性能下降。我在上面提到過這個,但是想在這裏重申一下。如果您使用LWT,請按比例測試! – markc