作者:小傅哥,博客:https://bugstack.cn
大家好,我是技術(shù)UP主小傅哥。
拿真實(shí)場(chǎng)景做方案、用大廠技術(shù)寫代碼,創(chuàng)作硬核的項(xiàng)目。全程一條龍的帶著分析需求
、設(shè)計(jì)架構(gòu)
、編寫代碼
、上線系統(tǒng)
,完成項(xiàng)目后,再帶著梳理簡(jiǎn)歷的編寫。這一套下來(lái),用小伙伴的話講;”把我抬進(jìn)了公司里去!“
面試官:”看過(guò)你的星球,很適合校招生積累技術(shù)“
進(jìn)入到3月,各個(gè)大廠都已經(jīng)陸續(xù)的推送了,實(shí)習(xí)/校招的招聘計(jì)劃。很多伙伴簡(jiǎn)歷項(xiàng)目不錯(cuò)的也都拿到了很好的 Offer!甚至不少大廠的面試官,也對(duì)市面的一些學(xué)習(xí)項(xiàng)目有所了解,知道求職者學(xué)習(xí)了什么項(xiàng)目可以得到成長(zhǎng)。 這有點(diǎn)類似于師承于誰(shuí),更好的得到了認(rèn)可。
那么,為了幫助更多的伙伴寫好簡(jiǎn)歷以及提前演練一些面試題的回答,這里小傅哥做了一套簡(jiǎn)歷模板和對(duì)應(yīng)的提問(wèn)解答。學(xué)習(xí)拼團(tuán)項(xiàng)目的小伙伴可以參考。
文末提供了全套項(xiàng)目的文檔、視頻、代碼,可以加入社群獲取全部課程資料。
一、項(xiàng)目介紹
你可以根據(jù)是實(shí)習(xí)、實(shí)踐、導(dǎo)師任務(wù)、學(xué)校課程、自己學(xué)習(xí),幾個(gè)方向來(lái)描述項(xiàng)目來(lái)源。
舉例;
面試官你好,拼團(tuán)交易平臺(tái)系統(tǒng),是我在日常使用拼多多
、騰訊
、京東
等服務(wù)平臺(tái),交易支付時(shí)候,了解到這樣的一種營(yíng)銷手段。它可以通過(guò)用戶自傳播方式增強(qiáng)交易量,也是拼多多最開(kāi)始起家形成巨大規(guī)模的一個(gè)業(yè)務(wù)邏輯。因此非常感興趣這樣的系統(tǒng),所以根據(jù)大廠分享的資料、與對(duì)應(yīng)的架構(gòu)師UP進(jìn)行交流學(xué)習(xí)了,設(shè)計(jì)了這樣一套系統(tǒng)。
該系統(tǒng)采用了 DDD 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)進(jìn)行建模,拆分領(lǐng)域模塊邊界,形成;活動(dòng)領(lǐng)域、人群領(lǐng)域、交易領(lǐng)域,來(lái)構(gòu)建拼團(tuán)營(yíng)銷交易流程,達(dá)到試算、鎖單、結(jié)算等步驟流程。這個(gè)過(guò)程中提煉了通用設(shè)計(jì)模式,規(guī)則樹(shù)、責(zé)任鏈,可以非常有效的統(tǒng)一的治理流程編排實(shí)現(xiàn)。
二、簡(jiǎn)歷模板
注意:? 不要直接復(fù)制粘貼簡(jiǎn)歷模板內(nèi)容!
項(xiàng)目名稱:拼團(tuán)營(yíng)銷服務(wù)系統(tǒng)
、交易營(yíng)銷場(chǎng)景 - 拼團(tuán)系統(tǒng)
、營(yíng)銷拼團(tuán)交易平臺(tái)
、仿拼多多/騰訊/京東,拼團(tuán)玩法系統(tǒng)(以大廠項(xiàng)目為背書)
、拼團(tuán)外賣平臺(tái)系統(tǒng)(結(jié)合其他項(xiàng)目一起組合)
? - 參考以上方式編寫自己的項(xiàng)目名稱,尤其拼團(tuán)還是一個(gè)微服務(wù),可以和很多其他系統(tǒng)組合。
項(xiàng)目架構(gòu):微服務(wù)設(shè)計(jì)
、分布式架構(gòu)
、DDD 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì) + 六邊形分層架構(gòu)實(shí)現(xiàn)
、前后端分離技術(shù)
核心技術(shù):SpringBoot、MyBatis、MySQL、Guava、Redis、RabbitMQ、動(dòng)態(tài)配置中心(DCC)、普羅米修斯監(jiān)控、Docker等 - 如果學(xué)習(xí)了其他技術(shù)棧也可以補(bǔ)充。
項(xiàng)目描述:
方式2(以提供服務(wù)介紹):該項(xiàng)目以拉動(dòng)/促進(jìn)/提高
(小型支付商城/外賣點(diǎn)餐/購(gòu)票出行/...)交易單量為目標(biāo),通過(guò)設(shè)計(jì)拼團(tuán)優(yōu)惠組隊(duì)下單為手段,達(dá)到增強(qiáng)用戶自傳播分享私域提高整個(gè)交易GMV的結(jié)果。三段式描述,...目標(biāo),...手段,...結(jié)果
方式3(以實(shí)際場(chǎng)景介紹):該項(xiàng)目是以促進(jìn)Xxx公司Xxx場(chǎng)景的核心營(yíng)銷優(yōu)惠玩法系統(tǒng),圍繞公司的xxx、yyy、zzz等全部交易業(yè)務(wù),設(shè)計(jì)通用的拼團(tuán)優(yōu)惠鎖單和組隊(duì)結(jié)算回調(diào)服務(wù)。此系統(tǒng)分布式架構(gòu)設(shè)計(jì),可支撐單機(jī)壓測(cè)量 xxx tps,tp99 xxx 的數(shù)據(jù)指標(biāo),有效的滿足公司的全量的業(yè)務(wù)場(chǎng)景接入使用。
方式1(以學(xué)習(xí)視角介紹):本項(xiàng)目參考拼多多
交易購(gòu)物拼團(tuán)場(chǎng)景,調(diào)研中大廠相關(guān)營(yíng)銷業(yè)務(wù)場(chǎng)景和技術(shù)架構(gòu)方案,設(shè)計(jì)實(shí)現(xiàn)了本套拼團(tuán)營(yíng)銷服務(wù)系統(tǒng),支持各類營(yíng)銷優(yōu)惠(直減、折扣、N元購(gòu))。該系統(tǒng)以面向?qū)ο箝_(kāi)發(fā),運(yùn)用 DDD 拆分領(lǐng)域邊界,使用設(shè)計(jì)模式設(shè)計(jì)服務(wù)功能。提高系統(tǒng)的擴(kuò)展性和可維護(hù)性。
核心方案:
-
-
- (舉例)通過(guò) Redis 發(fā)布訂閱模型,結(jié)合 Spring AOP 切面和代理,以自定義注解的方式控制屬性信息動(dòng)態(tài)配置。減少系統(tǒng)與 Redis 的 IO 交互,提高對(duì)高頻場(chǎng)景屬性值的使用時(shí)間效率。(舉例)設(shè)計(jì)拼團(tuán)組隊(duì)結(jié)算的 HTTP、MQ 雙重手段,滿足外部應(yīng)用和內(nèi)部微服務(wù)的不同方式對(duì)接,增強(qiáng)系統(tǒng)的適配性。同時(shí)為了保證整體方案的可靠性,在結(jié)算觸達(dá)時(shí),先異步多線程方式即時(shí)觸發(fā)回調(diào)(HTTP、MQ),再通過(guò)業(yè)務(wù)一致性任務(wù)數(shù)據(jù)補(bǔ)償校驗(yàn)。(MQ、HTTP,都可能因網(wǎng)絡(luò)原因?qū)е率?,因此需要重試)任?wù)的觸達(dá),還增加多分布式鎖,讓任務(wù)互備搶占方式執(zhí)行,增強(qiáng)系統(tǒng)的魯棒性設(shè)計(jì)。(舉例)設(shè)計(jì) Redis BitSet/BitMap 人群標(biāo)簽,用于過(guò)濾可見(jiàn)和可參與,拼團(tuán)活動(dòng)的人群信息。該人群標(biāo)簽可依賴于過(guò)往用戶數(shù)據(jù)(交易下單)通過(guò) job 任務(wù)完成人群標(biāo)簽的錄入。(舉例)通過(guò)策略模式,設(shè)計(jì)拼團(tuán)折扣(MJ、ZJ、NYG)的計(jì)算策略。同時(shí)折扣的計(jì)算也會(huì)通過(guò)人群標(biāo)簽過(guò)濾,以滿足運(yùn)營(yíng)策略配置,降低活動(dòng)風(fēng)險(xiǎn)。(舉例)運(yùn)用 retrofit2/okhttp3/spring cloud fegin + nginx 負(fù)載,對(duì)接拼團(tuán)交易平臺(tái)鎖單服務(wù),以及通過(guò) http 回調(diào)和 MQ 監(jiān)聽(tīng)來(lái)處理交易結(jié)算。
-
- (舉例)以拼團(tuán)試算場(chǎng)景舉例,運(yùn)用通用設(shè)計(jì)模式模型框架,完成試算;根節(jié)點(diǎn)、切量開(kāi)關(guān)、營(yíng)銷折扣、人群標(biāo)簽、異常兜底等流程串聯(lián)。設(shè)計(jì)這樣解耦設(shè)計(jì),極大的提到了程序的可擴(kuò)展性。(舉例)以拼團(tuán)鎖單場(chǎng)景舉例,拼團(tuán)鎖單場(chǎng)景,使用通用的責(zé)任鏈模型框架,校驗(yàn)活動(dòng)的有效性(狀態(tài)、有效期)和用戶的參與資格。(舉例)以拼團(tuán)結(jié)算場(chǎng)景舉例,拼團(tuán)結(jié)算場(chǎng)景,使用通用的責(zé)任鏈模型框架,校驗(yàn)渠道黑名單配置、拼團(tuán)組隊(duì)信息、交易時(shí)間屬性、訂單有效狀態(tài)等。
-
架構(gòu)設(shè)計(jì),以 DDD 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),四色建模方式,按照系統(tǒng)功能流程,拆解服務(wù)邊界。包括;活動(dòng)域、標(biāo)簽域、交易域。
設(shè)計(jì)模式,設(shè)計(jì)并提煉通用的責(zé)任鏈
、規(guī)則樹(shù)
模型框架,解決領(lǐng)域場(chǎng)景中多處,需要使用設(shè)計(jì)模式解耦復(fù)雜流程鏈路的調(diào)度(避免過(guò)多的if...else判斷)。鑒于多處場(chǎng)景的責(zé)任鏈?zhǔn)褂茫K框架設(shè)計(jì)責(zé)任鏈為執(zhí)行和鏈路分離組裝,便于工廠可以組合出各類執(zhí)行責(zé)任鏈,不被不同的鏈路管理影響(以往的責(zé)任鏈,一般是單例的,會(huì)被影響)。
規(guī)則過(guò)濾;
異步線程,為提高用戶體驗(yàn),將拼團(tuán)優(yōu)惠試算所需的營(yíng)銷類數(shù)據(jù)加載,由串行改為異步線程并行執(zhí)行。此執(zhí)行方式由通用設(shè)計(jì)模式模型框架提供。(如果由引入星球的動(dòng)態(tài)線程池,也可以在這里增加線程池的管理描述)
功能方案;
不要局限于以上的描述,可以結(jié)合?Ai + 喂進(jìn)去的信息,給你描述出屬于你獨(dú)一無(wú)二的簡(jiǎn)歷描述。這樣更有益于你的面試。
三、面試問(wèn)題
1. 項(xiàng)目設(shè)計(jì)與架構(gòu)
為什么選擇DDD領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)?如何劃分領(lǐng)域邊界?
答:DDD能有效解決復(fù)雜業(yè)務(wù)邏輯的拆解問(wèn)題,通過(guò)四色建模和業(yè)務(wù)場(chǎng)景分析,劃分出活動(dòng)域(管理拼團(tuán)規(guī)則)、標(biāo)簽域(用戶畫像和權(quán)限過(guò)濾)、交易域(訂單和結(jié)算)。例如,拼團(tuán)鎖單流程屬于交易域,而人群標(biāo)簽過(guò)濾屬于標(biāo)簽域。
微服務(wù)間如何通信?如何保證數(shù)據(jù)一致性?
答:對(duì)內(nèi)外對(duì)接系統(tǒng),分別采用HTTP(Feign/RestTemplate)和 MQ(RabbitMQ)方案。關(guān)鍵鏈路(如訂單結(jié)算)通過(guò)MQ保證最終一致性,結(jié)合本地事務(wù)表+補(bǔ)償任務(wù)(如定時(shí)檢查未完成的結(jié)算請(qǐng)求)。
六邊形架構(gòu)如何落地?解決了什么問(wèn)題?
答:通過(guò)適配器層隔離核心業(yè)務(wù)與外部依賴(如數(shù)據(jù)庫(kù)、Redis)。例如,訂單結(jié)算的核心邏輯獨(dú)立于HTTP回調(diào)或MQ監(jiān)聽(tīng)的具體實(shí)現(xiàn),提升核心代碼的穩(wěn)定性和可測(cè)試性。
DDD 是一個(gè)亮點(diǎn),中大廠公司都在推進(jìn) DDD 的項(xiàng)目重構(gòu)。站在技術(shù)角度,這樣的架構(gòu)更好維護(hù)。站在領(lǐng)導(dǎo)角度,這樣的拆分可以更好了解系統(tǒng)設(shè)計(jì)便于制訂KPI。同時(shí)有清晰的業(yè)務(wù)領(lǐng)域劃分,AI 開(kāi)發(fā)工具可以更好的結(jié)合進(jìn)來(lái)。招聘里DDD的體現(xiàn),jump這個(gè)崗位,好像為我量身定做!
2. 核心技術(shù)實(shí)現(xiàn)
Redis在項(xiàng)目中如何應(yīng)用?舉例說(shuō)明答:1)BitMap存儲(chǔ)用戶標(biāo)簽(如是否參與過(guò)某活動(dòng));2)分布式鎖控制拼團(tuán)組隊(duì)結(jié)算觸達(dá)并發(fā);3)緩存活動(dòng)配置(如有效期、折扣規(guī)則),降低數(shù)據(jù)庫(kù)壓力。
責(zé)任鏈模式如何解耦復(fù)雜流程?舉例說(shuō)明答:拼團(tuán)鎖單流程拆解為多個(gè)處理器鏈:活動(dòng)狀態(tài)校驗(yàn)→用戶資格校驗(yàn)→庫(kù)存檢查。每個(gè)處理器獨(dú)立實(shí)現(xiàn),通過(guò)工廠模式動(dòng)態(tài)組裝,避免if-else嵌套。
異步線程如何優(yōu)化性能?如何管理線程池?答:將營(yíng)銷數(shù)據(jù)加載從串行改為并行(如使用CompletableFuture)。通過(guò)動(dòng)態(tài)線程池監(jiān)控任務(wù)隊(duì)列和拒絕策略,結(jié)合普羅米修斯采集指標(biāo),避免線程池耗盡。注意多準(zhǔn)備下多線程、線程池的八股
3. 核心業(yè)務(wù)場(chǎng)景
拼團(tuán)結(jié)算的HTTP和MQ雙重回調(diào)如何設(shè)計(jì)?如何保證可靠性?
答:1)結(jié)算后同時(shí)發(fā)送HTTP請(qǐng)求和MQ消息;2)異步線程池處理回調(diào),失敗后進(jìn)入重試隊(duì)列;3)定時(shí)任務(wù)補(bǔ)償未完成回調(diào),配合分布式鎖避免重復(fù)執(zhí)行。
人群標(biāo)簽如何通過(guò)BitMap實(shí)現(xiàn)?舉例說(shuō)明
答:例如,用戶ID哈希后映射到BitMap的某一位。運(yùn)營(yíng)配置“僅限新用戶”的活動(dòng)時(shí),Job任務(wù)掃描歷史訂單,將老用戶對(duì)應(yīng)位標(biāo)記為0,查詢時(shí)通過(guò)BITCOUNT判斷資格。
策略模式在折扣計(jì)算中的應(yīng)用?如何擴(kuò)展新策略?
答:定義接口DiscountStrategy
,實(shí)現(xiàn)類?MJCalculateService
(滿減)、NCalculateService
(N元購(gòu))、ZJCalculateService
(直減)、ZKCalculateService
(折扣)。新增策略時(shí)只需添加實(shí)現(xiàn)類并注冊(cè)到Spring上下文,通過(guò)策略工廠按類型調(diào)用。
4. 高并發(fā)與容錯(cuò)(這部分會(huì)在第3階段加入)
如何解決庫(kù)存超賣問(wèn)題?
答:1)Redis原子操作(DECR)預(yù)扣庫(kù)存;2)數(shù)據(jù)庫(kù)最終扣減時(shí)加樂(lè)觀鎖;3)異步補(bǔ)償任務(wù)回滾異常訂單。
分布式鎖的實(shí)現(xiàn)方案?遇到過(guò)哪些坑?
答:基于Redis的Redisson(看門狗機(jī)制續(xù)期)。注意點(diǎn):1)鎖粒度細(xì)化(按活動(dòng)ID+商品ID);2)避免鎖過(guò)期后業(yè)務(wù)未執(zhí)行完,需結(jié)合版本號(hào)校驗(yàn)。
如何設(shè)計(jì)熔斷降級(jí)策略?
答:Sentinel監(jiān)控外部服務(wù)(如支付接口)的異常比例,超閾值時(shí)熔斷,降級(jí)為返回默認(rèn)錯(cuò)誤碼或緩存數(shù)據(jù),并記錄日志供補(bǔ)償任務(wù)處理。
5. 監(jiān)控與運(yùn)維(這部分會(huì)在第3階段加入)
如配置說(shuō)明接入普羅米修斯監(jiān)控,同時(shí)也可以使用 arthas、dump mat。地址:https://bugstack.cn/md/road-map/grafana.html
普羅米修斯監(jiān)控哪些指標(biāo)?如何定位性能瓶頸?
答:監(jiān)控接口TP99、線程池活躍度、Redis命中率、MQ堆積量。通過(guò)Grafana儀表盤分析慢SQL(MyBatis攔截器采集)或高耗時(shí)責(zé)任鏈節(jié)點(diǎn)。
動(dòng)態(tài)配置中心如何實(shí)現(xiàn)?如何保證實(shí)時(shí)性?
答:基于Nacos/Zookeeper,配置變更時(shí)通過(guò)Spring Cloud Bus通知服務(wù)。關(guān)鍵配置(如活動(dòng)開(kāi)關(guān))結(jié)合本地緩存,通過(guò)@RefreshScope實(shí)時(shí)生效。
Docker化部署的優(yōu)化經(jīng)驗(yàn)?
答:1)多階段構(gòu)建減小鏡像體積;2)JVM參數(shù)調(diào)優(yōu)(-Xmx限制內(nèi)存);3)健康檢查接口 skywalking、artash 探針結(jié)合,實(shí)現(xiàn)系統(tǒng)監(jiān)控。
6. 設(shè)計(jì)模式與代碼規(guī)范
規(guī)則樹(shù)模式如何實(shí)現(xiàn)?舉例說(shuō)明
答:根節(jié)點(diǎn)為入口,子節(jié)點(diǎn)為具體規(guī)則(如切量、標(biāo)簽過(guò)濾)。每個(gè)節(jié)點(diǎn)實(shí)現(xiàn)RuleNode
接口,通過(guò)組合模式構(gòu)建樹(shù)形結(jié)構(gòu),支持動(dòng)態(tài)擴(kuò)展節(jié)點(diǎn)。
如何避免策略模式帶來(lái)的類膨脹問(wèn)題?
答:1)將策略實(shí)現(xiàn)類定義為無(wú)狀態(tài)Bean,復(fù)用實(shí)例;2)通過(guò)注解+自動(dòng)掃描注冊(cè)策略;3)策略參數(shù)化配置,減少重復(fù)代碼。
AOP在項(xiàng)目中的典型應(yīng)用場(chǎng)景?
答:1)DCC 動(dòng)態(tài)配置中心;2)@LogTrack 記錄核心鏈路日志(切面加日志,可以讓 DeepSeek 寫個(gè)案例);
7. 擴(kuò)展性與業(yè)務(wù),你怎么設(shè)計(jì)新功能?
如何支持多種拼團(tuán)類型(如老帶新、階梯團(tuán))?
答:抽象拼團(tuán)模板(Template Pattern),定義成團(tuán)條件接口(如人數(shù)滿額、金額達(dá)標(biāo))。新增類型時(shí)實(shí)現(xiàn)接口,并通過(guò)工廠模式注入。
如何設(shè)計(jì)活動(dòng)預(yù)熱機(jī)制?
答:1)活動(dòng)開(kāi)始前定時(shí)任務(wù)加載配置到Redis;2)緩存熱門活動(dòng)的商品信息;3)通過(guò)壓測(cè)工具預(yù)熱JVM和線程池。
如何實(shí)現(xiàn)灰度發(fā)布?
答:1)Apollo配置中心按用戶ID百分比切流;2)網(wǎng)關(guān)層根據(jù)請(qǐng)求頭路由到新老服務(wù);3)結(jié)合Prometheus監(jiān)控異常,快速回滾。
8. 綜合問(wèn)題
項(xiàng)目中最大的挑戰(zhàn)是什么?如何解決?
答:高并發(fā)下Redis雪崩。解決方案:1)緩存分層(本地緩存+Redis);2)熱點(diǎn)數(shù)據(jù)預(yù)加載;3)隨機(jī)過(guò)期時(shí)間。
如果讓你重構(gòu)系統(tǒng),會(huì)優(yōu)化哪些點(diǎn)?
答:1)引入分庫(kù)分表解決訂單表膨脹;2)增加AI + RAG + MCP 提供智能分析和運(yùn)營(yíng)服務(wù);3)使用Guava本地緩存,管理復(fù)雜數(shù)據(jù)結(jié)構(gòu)。
如何向非技術(shù)人員解釋系統(tǒng)設(shè)計(jì)?
答:類比“組隊(duì)購(gòu)物”,系統(tǒng)像智能管家:1)自動(dòng)匹配規(guī)則(如折扣);2)確保組隊(duì)不超時(shí);3)失敗時(shí)自動(dòng)重試,保證最終成功。
關(guān)于系統(tǒng)面試問(wèn)題,涉及到的監(jiān)控、數(shù)據(jù)、指標(biāo)類,最好使用云服務(wù)部署上線 + 普羅米修斯監(jiān)控完成壓測(cè)和優(yōu)化。
加入小傅哥的社群,如圖的全套實(shí)戰(zhàn)項(xiàng)目,都可以學(xué)習(xí);
關(guān)注公眾號(hào)「bugstack蟲(chóng)洞?!够貜?fù)「星球」獲得限量?jī)?yōu)惠券??!