字節面試:請說一下DDD的流程,用電商系統爲場景

文章很長,且持續更新,建議收藏起來,慢慢讀!瘋狂創客圈總目錄 博客園版 爲您奉上珍貴的學習資源 :

免費贈送 :《尼恩Java面試寶典》 持續更新+ 史上最全 + 面試必備 2000頁+ 面試必備 + 大廠必備 +漲薪必備
免費贈送 :《尼恩技術聖經+高併發系列PDF》 ,幫你 實現技術自由,完成職業升級, 薪酬猛漲!加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷1)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷2)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷3)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領

免費贈送 資源寶庫: Java 必備 百度網盤資源大合集 價值>10000元 加尼恩領取


字節面試:請說一下DDD的流程,用電商系統爲場景

說在前面

在40歲老架構師 尼恩的讀者交流羣(50+)中,最近有小夥伴拿到了一線互聯網企業字節、如阿里、滴滴、極兔、有贊、希音、百度、網易、美團的面試資格,遇到很多很重要的面試題:

談談你的DDD落地經驗?

談談你對DDD的理解?

如何保證RPC代碼不會腐爛,升級能力強?

用電商系統爲例介紹一下領域驅動設計DDD?

最近有小夥伴在字節,又遇到了相關的面試題。小夥伴懵了, 當然,面試也就掛了

這裏尼恩給大家做一下系統化、體系化的 DDD 梳理,使得大家可以充分展示一下大家雄厚的 “技術肌肉”,讓面試官愛到 “不能自已、口水直流”

也一併把這個題目以及參考答案,收入咱們的 《尼恩Java面試寶典》V122版本,供後面的小夥伴參考,提升大家的 3高 架構、設計、開發水平。

最新《尼恩 架構筆記》《尼恩高併發三部曲》《尼恩Java面試寶典》的PDF,請關注公衆號【技術自由圈】獲取,後臺回覆:領電子書

出了本文,尼恩輸出了一個 《從0到1,帶大家精通DDD》系列,幫助大家徹底掌握DDD,鏈接地址是:

阿里DDD大佬:從0到1,帶大家精通DDD

阿里大佬:DDD 落地兩大步驟,以及Repository核心模式

阿里面試:讓代碼不腐爛,DDD是怎麼做的?

阿里大佬:DDD 領域層,該如何設計?

極兔面試:微服務爆炸,如何解決?Uber 是怎麼解決2200個微服務爆炸的?

阿里大佬:DDD中Interface層、Application層的設計規範

大家可以先看前面的文章,再來看本篇,效果更佳。

另外,尼恩會結合一個工業級的DDD實操項目,在第34章視頻《DDD的頂奢面經》中,給大家徹底介紹一下DDD的實操、COLA 框架、DDD的面試題。

本文目錄

領域驅動設計介紹

領域驅動設計(Domain-driven Design,DDD)是一種軟件設計方法,該方法的核心思想是將業務領域作爲設計和開發的中心,強調對業務領域的深入理解、業務語言的建模以及領域對象的設計和實現。

這樣可以更好地將軟件設計和業務需求緊密結合起來,從而提高軟件的可維護性、可擴展性和可重用性,使得軟件更加貼近業務需求。

DDD設計的兩個階段包括兩部分,戰略設計部分和戰術設計部分:

第1步: 戰略設計

戰略設計主要從業務視角出發,包括了業務場景分析、領域建模、劃分邊界上下文三個階段。限界上下文可以作爲微服務設計的參考邊界。

第2步:戰術設計

戰術設計則從技術視角出發,側重於領域模型的技術實現,完成軟件開發和落地,

戰術設計包括:聚合根、實體、值對象、領域服務、應用服務和資源庫等代碼邏輯的技術設計和技術設計。

第1步:戰略設計

在戰略設計階段,我們最主要的過程大致包括了業務場景分析、領域建模、劃分邊界上下文三個階段。

實際上戰略設計是 DDD 過程中的核心步驟。

1、業務分析

在這個階段我們所有做的就是進行全面的業務梳理,把業務中涉及到的所有細節都梳理出來,爲後續進行領域建模分析提供足夠的、全面的業務輸入。

戰略設計 經常使用到的業務場景分析方法主要包括

  • 用例分析法
  • 事件風暴法
  • 四色建模法。

一般使用事件風暴法。

事件風暴是一種快速,輕量級且未得到充分認可的羣體建模技術,它對於加速開發團隊而言非常強大,有趣且有用。

事件風暴業務分析的核心環節

這裏我們使用事件風暴進行業務場景的分析以及梳理。

(1)事前準備

在進行事件風暴之前我們需要進行一些準備,主要包括貼紙、筆以及討論的會議室,

會議室中最好不要有椅子,目的是想讓大家都能夠站立在一起、全神貫注的去進行業務討論。

(2)邀請參會的人

會議的參與方主要包括用戶、產品經理、PD、研發、測試、架構師等。

其中,PD爲產品設計師,也可能叫產品規劃師、需求分析師、小產品經理。

PD側重於將對應用做功能級的設計,在這個模塊上,PD類似是一個小產品經理、模塊級別的產品經理。

架構師(系統分析師)會與PD緊密合作,架構師 這時候開始考慮技術可行性,性價比。

PD的職位描述:

(1)調查市場並研究需求,形成市場需求文檔。

(2)負責新產品設計,擬定設計規劃和方案。

(3)負責新產品的原型設計。

(4)組織產品開發團隊,協調資源,跟進產品的開發,保證日程進度。

(5)分析產品運營數據,收集運營意見,及時調整產品形態,優化產品,並提出合理的運營建議。

(6) 以用戶體驗爲中心,改進現有產品,或設計新產品。

(3)業務討論

首先確定我們今天需要討論的業務是什麼,目標是什麼。

咱們業務場景中,如果討論的業務就是電商,那麼,目標就是完成業務梳理,確保沒有業務方面的理解 gap,在團隊中達成業務理解的的一致性。

事件風暴過程需要問題驅動,一般通過提問的方式來驅動交流。

a、分析業務中的事件,搞清楚事件發生的前因後果

  • 什麼動作會導致當前事件的發生,
  • 當前這個事件發生後又會導致怎樣的後果。

這些我們都需要梳理清楚。

還有一點需要注意, 需要全面梳理

  • 不但要關注正常的業務流程,
  • 還要關注異常的業務流程。

b、尋找業務邏輯和業務規則

:在進行事件風暴過程中,所有的參與人都要全身投入整個過程,

大家都是站立形式,聚焦全部注意力,

大家都放下手機以及電腦,一起參與整個業務梳理過程,只有這樣,事件風暴纔可能有比較好的效果。

在前面的事件風暴業務梳理中,我們已經把電商業務涉及到的參與者、動作以及事件等都進行了全面的梳理。

參與者、動作以及事件 整個協作流程,是一個粗粒度的 業務流程, 非常粗。

2、領域建模

那麼接下來我們就要在此基礎之上,進行細粒度的 領域建模,這是整個 DDD 的核心。

DDD領域模型 細分爲兩步驟,第一步是發散,產生很多實體、命令、事件等領域對象,

DDD領域模型 細分爲兩步驟,第二步是收斂,我們從不同的維度對進行聚類形成聚合,建立最終領域模型, 這是一個收斂的過程。

(1)發散階段:領域對象分析

領域對象分析,也就 實體、值對象、領域事件、領域命令的分析。

(2)收斂階段:構建業務聚合

完成領域對象分析之後,我們需要構建業務聚合。

想要構建聚合,那麼首先就要在實體中找到聚合根。

來看看,一個 聚合根的特點:

  • 聚合根一定是實體,那麼它具有全局唯一的標識,
  • 聚合根是具備生命週期的
  • 聚合根需要專門的模塊來進行管理。

3、劃分邊界上下文

獲得了整個業務流程中的所有聚合後,我們需要更具業務語義上下文將具體的聚合劃分到對應的上下文中,

  • 域的拆分
    • 按業務抽象進行劃分
    • 一個業務拆分成幾個獨立的域,每個域又可細拆成不同子域
  • 防腐
    • 一個域在訪問其他域的模型時,把獲取到的模型做層轉換映射到自己域的模型中(不直接使用別的域模型作爲自己域模型中的一部分)
    • 防止源域模型發生變更,依賴源域模型的調用方,在需要源域模型新功能時,必須要全局依賴修改,纔在能兼容
    • 防止域上下文不一致產生的衝突
  • 限界上下文之間的映射關係
    • 合作關係(Partnership):兩個上下文緊密合作的關係,一榮俱榮,一損俱損。
    • 共享內核(Shared Kernel):兩個上下文依賴部分共享的模型。
    • 客戶方-供應方開發(Customer-Supplier Development):上下文之間有組織的上下游依賴。
    • 遵奉者(Conformist):下游上下文只能盲目依賴上游上下文。
    • 防腐層(Anticorruption Layer):一個上下文通過一些適配和轉換與另一個上下文交互。
    • 開放主機服務(Open Host Service):定義一種協議來讓其他上下文來對本上下文進行訪問。
    • 發佈語言(Published Language):通常與OHS一起使用,用於定義開放主機的協議。
    • 大泥球(Big Ball of Mud):混雜在一起的上下文關係,邊界不清晰。
    • 另謀他路(SeparateWay):兩個完全沒有任何聯繫的上下文。

第2步:戰術設計

在戰略設計階段,我們通過事件風暴法對整體的業務進行了全部的梳理,同時構建了領域模型,以及劃分了邊界下文。

那麼接下來我們就要將領域模型映射到工程結構,以及代碼中實現最終的實現落地。

另外在這個階段實際還有很多細節需要明確的。

1、領域服務設計

需要哪些領域服務,領域服務依賴哪些屬性,依賴哪些實體,依賴哪些值對象,這些都是需要在戰術設計階段明確下來。

2、領域分層

在領域分層方面,可以按照cola分層結構來進行,這個後面結合cola框架進行說明。

3、代碼結構

當我們把領域對象進行進一步的細化之後,同時把對應的領域服務敲定之後,我們可以把這些分析後的內容映射成工程分層後的代碼了。

所以,後續就進入到階段了,還有很多工作要做,比如詳細設計、編寫代碼以及功能測試,

特別實在詳細設計階段,我們還要涉及很多的細節問題的敲定,比如數據庫表的設計、比如使用什麼 MQ,用不用緩存,怎麼保證緩存和數據庫的數據一致性問題,分佈式服務有沒有分佈式事務的問題,應該怎麼解決?

有沒有服務冪等問題,應該怎麼解決?

這些都是需要在詳細設計階段進行確定的。

因此 DDD 就像是框架,通過它把業務映射成爲領域對象以及領域服務和領域事件,再把這些領域相關內容再讀映射爲實際的代碼。

使得我們的服務更加的邏輯清晰以及擴展性更強,但是分佈式的技術實現細節,我們還是需要有對應的解決方案來進行解決。

電商的領域驅動設計

第1步:戰略設計

1、事件風暴:參與者、動作以及事件 整個協作流程梳理

大致可以梳理出下面的參與者、動作以及事件

  1. 訂單創建事件:當用戶下單後,系統需要創建一個新的訂單,並觸發訂單創建事件。
  2. 訂單支付事件:當用戶完成訂單支付後,系統需要將訂單狀態設置爲已支付,並觸發訂單支付事件。
  3. 訂單發貨事件:當商家完成訂單發貨後,系統需要將訂單狀態設置爲已發貨,並觸發訂單發貨事件。
  4. 訂單退款事件:當用戶申請退款並經過審覈後,系統需要將訂單狀態設置爲已退款,並觸發訂單退款事件。
  5. 商品上架事件:當商家將商品上架時,系統需要將商品狀態設置爲上架,並觸發商品上架事件。
  6. 商品下架事件:當商家將商品下架時,系統需要將商品狀態設置爲下架,並觸發商品下架事件。
  7. 庫存變更事件:當用戶下單後,系統需要檢查商品庫存是否充足,並對庫存進行相應的變更,並觸發庫存變更事件。
  8. 物流狀態變更事件:當訂單狀態變更爲已發貨時,系統需要記錄物流信息,並觸發物流狀態變更事件。

通過對領域事件的記錄和處理,可以在電商系統中實現更加複雜的業務邏輯,提高系統的靈活性和可維護性。

2、領域建模與邊界上下文劃分

電商系統中的聚合和聚合根是什麼?

在電商系統中,可以將訂單作爲一個聚合,其中包括多個領域對象,例如訂單項、收貨地址、發票信息等。

訂單作爲一個聚合,它的內部領域對象之間有明確的關聯關係,並且需要滿足一些業務規則,例如訂單項的數量不能爲負數,訂單狀態必須是待付款、待發貨、待收貨、已完成等狀態之一。

在訂單聚合中,可以將訂單對象作爲聚合根,用於保證訂單聚合的完整性和一致性。訂單對象具有唯一標識和全局訪問權限,它可以被其他領域對象引用,例如訂單項和收貨地址等。

使用聚合和聚合根可以將複雜的業務邏輯封裝在一個邊界內,提高系統的可維護性和可擴展性。

電商系統是一個涉及到多個業務領域的複雜應用系統,經過上下文建模和邊界上下文劃分,最後確定電商系統所包含了衆多的子域。

以下是電商系統中常見的一些子域:

  1. 商品子域:包括商品分類、商品管理、商品展示等功能。
  2. 訂單子域:包括下單、訂單管理、訂單配送、訂單支付等功能。
  3. 營銷子域:包括促銷活動、優惠券、積分、禮品卡等功能。
  4. 用戶子域:包括用戶註冊、用戶登錄、用戶個人信息管理等功能。
  5. 支付子域:包括支付方式、支付渠道、支付接口等功能。
  6. 物流子域:包括訂單配送、物流跟蹤、運費計算等功能。
  7. 客服子域:包括售後服務、用戶反饋、在線客服等功能。
  8. 數據統計子域:包括用戶行爲分析、交易數據統計、業務數據報表等功能。

在實際的電商應用系統中,可能會根據業務需求進一步細分和擴展各個子域。每個子域都可以作爲一個獨立的微服務進行設計和開發,從而實現更好的業務解耦和系統擴展性。

第2步:戰術階段

核心是領域服務設計

電商系統中包括的領域服務,主要如下:

  1. 商品服務:負責管理商品的上架、下架、庫存等信息,並提供商品的查詢、搜索、推薦等功能。
  2. 訂單服務:負責管理訂單的創建、支付、發貨、退款等流程,並提供訂單的查詢、取消、評價等功能。
  3. 用戶服務:負責管理用戶的註冊、登錄、個人信息管理等功能,並提供用戶評價、收藏、關注等功能。
  4. 支付服務:負責管理系統的支付方式、支付賬戶等信息,並提供支付的流程和接口。
  5. 物流服務:負責管理物流的配送、快遞信息等,並提供物流的查詢、跟蹤等功能。
  6. 營銷服務:負責管理系統的促銷活動、優惠券等信息,並提供優惠券領取、使用等功能。
  7. 數據統計服務:負責收集、分析、展示系統的數據統計信息,例如訂單量、銷售額、用戶活躍度等。
  8. 客服服務:負責管理系統的客戶服務、投訴處理等工作,並提供在線客服、電話客服等渠道。

這些領域服務之間相互協作,共同實現電商系統的核心功能和業務流程。

通過領域服務的劃分和封裝,可以提高系統的可擴展性和可維護性,降低系統的耦合度和複雜度。

領域驅動設計與微服務的關係

領域驅動設計(DDD)和微服務是兩種不同的概念,但它們可以結合在一起來提高軟件的質量和可維護性。

微服務架構是一種將應用程序拆分成多個小型、自治的服務的架構模式,每個服務專注於某個特定的業務功能,通過輕量級通信機制進行協作。

微服務架構通常需要處理大量的業務邏輯,因此需要一個清晰的領域模型來管理這些業務邏輯,這時領域驅動設計就能夠發揮作用了。

通過領域驅動設計,開發人員可以更好地理解業務需求,更好地建模業務領域,將領域模型作爲微服務架構的核心,從而更好地支持微服務架構。

具體來說,領域驅動設計可以幫助實現以下方面:

  1. 微服務的拆分和劃分:通過領域驅動設計,可以將業務領域劃分爲不同的子域,並將每個子域劃分爲一個或多個微服務,從而實現微服務的拆分和劃分。

  2. 服務間的通信:微服務架構中的服務需要通過通信機制進行協作。

    通過領域驅動設計,可以在微服務之間定義明確的接口和協議,使得服務之間的通信更加清晰和穩定。

  3. 微服務的擴展和維護:通過領域驅動設計,可以將業務邏輯清晰地劃分爲不同的領域模型,從而使得微服務的擴展和維護更加容易。例如,在需要修改業務邏輯時,只需要修改對應的領域模型和微服務,而不需要修改整個應用程序。

因此,領域驅動設計可以幫助開發人員更好地支持微服務架構,並實現更好的軟件設計和開發。

領域驅動設計與敏捷開發相結合

領域驅動設計和敏捷開發是兩種不同的方法論,但可以相互結合,提高開發效率和軟件質量。

在敏捷開發過程中,團隊通常採用迭代式的開發模式,不斷地根據用戶反饋和需求變化進行調整和優化。

這種敏捷開發模式與領域驅動設計的思想相契合,因爲領域驅動設計強調將業務領域建模爲一個相對獨立的系統,同時也強調不斷優化和迭代。

以下是一些結合領域驅動設計和敏捷開發的方法:

  1. 劃分迭代週期:在敏捷開發中,團隊通常會劃分出多個迭代週期來實現軟件的開發和交付。在每個迭代週期中,可以採用領域驅動設計方法進行領域建模和設計,以確保軟件系統的質量和可維護性。
  2. 與領域專家和用戶緊密合作:在敏捷開發中,團隊需要與領域專家和用戶緊密合作,及時獲取用戶反饋和需求變化。在領域驅動設計中,也需要與領域專家和用戶緊密合作,以確保領域建模的準確性和實用性。
  3. 重構和優化:敏捷開發中,團隊需要不斷地重構和優化代碼,以提高軟件系統的質量和可維護性。在領域驅動設計中,也需要不斷地優化領域建模和設計,以提高系統的可擴展性和可維護性。
  4. 測試和驗收:在敏捷開發中,團隊需要進行測試和驗收,以確保軟件系統的質量和穩定性。在領域驅動設計中,也需要進行測試和驗收,以確保領域建模和設計的準確性和實用性。

未完待續,尼恩說在最後

DDD 面試題,是非常常見的面試題。 DDD的學習材料, 汗牛塞屋,又缺乏經典。

大家面試的時候, 可以參考以上的內容去組織答案,如果大家能做到對答如流,如數家珍,基本上 面試官會被你 震驚到、吸引到。

另外在面試之前,建議大家系統化的刷一波 5000頁《尼恩Java面試寶典PDF》,並且在刷題過程中,如果有啥問題,大家可以來 找 40歲老架構師尼恩交流。

最終,讓面試官愛到 “不能自已、口水直流”。offer, 也就來了。

當然,關於DDD,尼恩即將給大家發佈一波視頻 《第34章:DDD的頂奢面經》, 幫助大家徹底穿透DDD。

技術自由的實現路徑:

實現你的 架構自由:

喫透8圖1模板,人人可以做架構

10Wqps評論中臺,如何架構?B站是這麼做的!!!

阿里二面:千萬級、億級數據,如何性能優化? 教科書級 答案來了

峯值21WQps、億級DAU,小遊戲《羊了個羊》是怎麼架構的?

100億級訂單怎麼調度,來一個大廠的極品方案

2個大廠 100億級 超大流量 紅包 架構方案

… 更多架構文章,正在添加中

實現你的 響應式 自由:

響應式聖經:10W字,實現Spring響應式編程自由

這是老版本 《Flux、Mono、Reactor 實戰(史上最全)

實現你的 spring cloud 自由:

Spring cloud Alibaba 學習聖經》 PDF

分庫分表 Sharding-JDBC 底層原理、核心實戰(史上最全)

一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之間混亂關係(史上最全)

實現你的 linux 自由:

Linux命令大全:2W多字,一次實現Linux自由

實現你的 網絡 自由:

TCP協議詳解 (史上最全)

網絡三張表:ARP表, MAC表, 路由表,實現你的網絡自由!!

實現你的 分佈式鎖 自由:

Redis分佈式鎖(圖解 - 秒懂 - 史上最全)

Zookeeper 分佈式鎖 - 圖解 - 秒懂

實現你的 王者組件 自由:

隊列之王: Disruptor 原理、架構、源碼 一文穿透

緩存之王:Caffeine 源碼、架構、原理(史上最全,10W字 超級長文)

緩存之王:Caffeine 的使用(史上最全)

Java Agent 探針、字節碼增強 ByteBuddy(史上最全)

實現你的 面試題 自由:

4800頁《尼恩Java面試寶典 》 40個專題

免費獲取11個技術聖經PDF:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章