如何設計基於事件驅動架構的銷售庫存微服務?- Jasbir
在這篇文章中,我將帶領大家瞭解OneShop(我們的電子商務產品)的銷售庫存解決方案。
銷售庫存解決方案也是一個為所有渠道(OneShop、OneApp等)和Natcos統一的多租戶解決方案。它確保了銷售檢視和倉庫庫存之間近乎實時的同步。
庫存管理流程
- 每當收到一批新裝置,管理員就會更新庫存中的裝置。
- 一個使用者在一個渠道(網路,應用程式)上顯示對庫存中的裝置感興趣。一旦使用者將裝置新增到他的購物車中,它就會被保留X分鐘。
- 如果使用者在X分鐘內下了訂單,裝置數量將從庫存中減去。
- 一旦池中的裝置用完,管理員將再次更新池。
產品的幾個重要狀態
- 如果倉庫裡有超過一個單位的裝置,那麼就是有庫存IN-STOCK。
- 如果倉庫中沒有任何單位可用,則為缺貨OUT-OF-STOCK 。
- 如果它是一個新的獨家釋出的產品,可供預先訂購PRE-ORDER。
同步化的挑戰
- 從銷售目錄提供的裝置清單應該反映裝置的正確狀態(IN-STOCK, OUT-OF-STOCK, PRE-ORDER)。
- 如果裝置只剩下一個單位的庫存,在銷售庫存中建立一個X分鐘的預訂可能會更新裝置的狀態。這意味著裝置狀態從IN-STOCK過渡到OUT-OF-STOCK。
- 在X分鐘後取消銷售庫存中的預訂,如果該裝置只有一個單位的庫存,應該影響該裝置的狀態。這意味著裝置狀態從OUT-OF-STOCK過渡到IN-STOCK。
我們正在尋找一個可以解決的方案:
- 如何保持物理庫存和裝置池資料庫之間的同步?
- 如何保留一個裝置X分鐘?
- 如何確保裝置預訂在正確的時間到期?
- 如何讓管理員的實時使用者訂單和庫存更新保持一致?
- 網頁和應用程式上的裝置列表是透過銷售目錄中的彈性搜尋(ES)提供的。我們需要在ES文件中提供一致的裝置狀態資訊,因為現貨裝置應該在上面。ES檔案將如何更新為正確的狀態?
技術方案
- MongoDB
- Elastic Search
- Netflix Conductor (orchestration engine)
- Spring boot based microservices
我們將問題分解為四個部分:
1、狀態同步事件驅動核心
- 它被用作實現的中心,以同步裝置的狀態,由於庫存載入、預訂更新、訂單等操作。
- 銷售庫存中的任何更新操作(POST/PUT)都會導致MongoDB中的資料變化。
- 因此,mongo產生了一個變化事件。
- 該變更事件被執行在銷售庫存微服務中的變更流事件監聽器監聽。
- 變化流事件監聽器啟動一個conductor工作流。
- 然後,conductor啟動一個任務calculate_capacity_status。這個任務在一個庫存微服務中執行。它透過讀取可用庫存和計算當前的預訂數量來計算裝置的狀態。
- 然後,conductor會決定(conveter_decision)銷售目錄中是否有狀態變化。
如果狀態變化是適用的,那麼指揮者啟動一個任務update_catalog_capacity_status來更新ES中裝置的狀態。這個任務在銷售目錄微服務中執行,以更新裝置的狀態,從IN-STOCK到OUT-OF-STOCK,反之亦然。
2、將資料載入到銷售庫存中
- 銷售庫存的資料載入可以由管理員手動完成,也可以由倉庫實時請求。
- 庫存透過庫存管理介面手動載入到銷售庫存中,或者透過連線到倉庫的分銷商自動載入。
對銷售庫存的POST API操作導致mongo中的資料變化,然後執行上述的 "狀態同步事件驅動核心"。
3、新增到購物車時的銷售庫存更新。在購物車或提交訂單中增加一個專案會導致裝置的狀態發生變化。
- 每當一個專案被新增到購物車中,一個專案就會在預訂集合中的一個臨時檔案中被保留X分鐘,其TTL為X分鐘。
- 每當預訂過期時,檔案會從集合中刪除,變化流事件會觸發 "狀態同步事件驅動的核心"。
- 像上面一樣,同樣的事情發生在提交訂單的情況下。訂單意味著將預訂晉升為訂單。因此,庫存的實際計數被遞減並觸發 "狀態同步事件驅動的核心"。
4、將狀態暴露給渠道。任何渠道都可能需要查詢每個裝置的庫存狀態或數量。銷售庫存為這一目的從其核心暴露了簡單的GET操作。
解決方案的亮點
- 該設計是模組化和事件驅動的。由多個微服務組成的解決方案是鬆散耦合的。
- 透過使用mongo變更事件,我們能夠監聽到庫存狀態的每一個變化。
- 導遊工作流的使用幫助我們消除了銷售目錄和銷售庫存兩個領域之間的耦合。
- 我們能夠設計解決方案的事件驅動核心,該核心已被插入與銷售庫存的所有型別的互動中,無論是資料載入、專案購買還是預訂到期。
- 有一個單一的驅動程式來更新裝置的狀態變化。
這就是所有關於銷售庫存的解決方案。請繼續關注閱讀OneShop中的其他解決方案,以解決許多更復雜的問題。
相關文章
- 基於事件溯源與CDC的事件驅動微服務架構案例原始碼事件微服務架構原始碼
- 事件驅動的微服務-事件驅動設計事件微服務
- 關於如何設計一個基於事件驅動架構的思考事件架構
- 微服務事件驅動架構演進微服務事件架構
- 微服務架構設計基礎之領域驅動設計微服務架構
- 如何在Java中實現事件驅動的微服務架構Java事件微服務架構
- Java開發架構篇:領域驅動設計架構基於SpringCloud搭建微服務Java架構SpringGCCloud微服務
- 事件驅動架構設計事件架構
- 基於SpringCloud的微服務架構設計SpringGCCloud微服務架構
- [譯] 理解 NodeJS 中基於事件驅動的架構NodeJS事件架構
- 微服務與領域驅動設計,架構實踐總結微服務架構
- 基於sanic的微服務基礎架構微服務架構
- 基於微服務和Docker的PaaS雲平臺架構設計微服務Docker架構
- 如何設計最佳的微服務架構 -DZone微服務架構
- 淺談基於 Laravel 開發的 MeEdu 的微服務架構設計Laravel微服務架構
- 架構設計思想-微服務架構設計模式架構微服務設計模式
- 基於 ASK + EB 構建容器事件驅動服務事件
- 架構設計 | 基於Seata中介軟體,微服務模式下事務管理架構微服務模式
- 如何設計一個容錯的微服務架構微服務架構
- 事件驅動的微服務-建立第三方庫事件微服務
- 微服務架構設計基礎之立方體模型微服務架構模型
- 基於容器雲的微服務架構實踐微服務架構
- 微服務架構和設計模式 - DZone微服務微服務架構設計模式
- [譯] 微服務從設計到部署(五)事件驅動資料管理微服務事件
- 微服務領域驅動設計 - semaphoreci微服務
- [雲原生微服務架構](十)微服務架構的基礎知識微服務架構
- 當今微服務盛行之架構師必經之路-領域驅動設計-上微服務架構
- 當今微服務盛行之架構師必經之路-領域驅動設計-下微服務架構
- Spring Cloud構建微服務架構:訊息驅動的微服務(消費組)【Dalston版】SpringCloud微服務架構
- 一種基於事件驅動架構的 SAP 產品整合方案介紹事件架構
- 基於Java的微服務架構原始碼案例AbixenJava微服務架構原始碼
- spring cloud微服務架構設計SpringCloud微服務架構
- 如何構建微服務架構微服務架構
- 教你玩轉微服務--基於DDD的微服務架構落地實踐之路微服務架構
- 基於Redis構建微服務的反應式架構 - bitsrcRedis微服務架構
- 事件驅動架構EDA中的元件事件架構元件
- 混合雲中的事件驅動架構事件架構
- SummerSoC 2020:基於領域驅動的服務設計(SOA/微服務) – Stefan Kapferer微服務