2

我有一個系統,其中包含customer實體和user實體。使用微服務期間的步驟嚮導UI

Customer是一個誰付錢。每個客戶包含1-N個用戶。客戶有鏈接到用戶。

User沒有客戶就不能存在。用戶實體包含CustomerId。

問題是我被限制使用特定的UI來創建客戶。客戶創造的過程包括在UI 2步:

  • 填寫有關客戶的信息:名字,姓氏,地址等
  • 第二步爲客戶創造用戶。

主要想法是在步驟2結束時創建客戶和用戶。如果我可以將兩個實體都存儲在同一個數據庫中,那將很簡單。我可以在一次ACID交易中完成。這將節省所有或沒有。

不幸的是,我使用微服務 - 客戶和用戶是與自己的存儲不同的微服務。兩個存儲都不是數據庫 - 存儲沒有事務選項。所以Customer實體使用存儲1和User實體使用存儲2.

我建議在第一步後保存客戶。然後在第二步之後保存用戶。但是在第二個用戶界面步驟中有一個取消按鈕,該按鈕應刪除在整個過程中創建的所有用戶和客戶。建議被拒絕。 問題是,如果具有特定用戶名的用戶已經存在,我不應該保存,也不應該保存客戶,也不應該保存用戶。

我的問題是:

  • 多少RootAgregates我有嗎?一個或兩個?
  • 將用戶存儲在與客戶存儲不同的存儲中是否正確?
  • 這種情況下正確的做法是什麼?

P.S.我不喜歡將用戶保存在客戶中的想法。在惹惱用戶的情況下,我需要與客戶合作。另一個問題是我需要用戶在整個系統中是唯一的,並且需要獲得所有用戶的列表。

P.S.我用戶Azure服務結構和演員模型。

+1

好吧,看起來你的服務邊界可能是錯誤的,如果你想要強一致性。否則,你只能希望最終的一致性。基本上你應該有一些東西(例如進程管理器)來跟蹤整個進程並消耗事件從一個狀態轉換到另一個狀態。 – plalx

回答

1

我有幾種RootAgregate?一個或兩個?

  • 您有一個聚集根和一個實體。

是它來存儲用戶在不同的存儲比 客戶存儲一個正確的做法?

  • 不,它不是。因爲你應該每個聚合都有一個倉庫。

看看Effective Aggregate Design by Vaughn Vernon如何設計聚合。