分散式電商營銷系統的實踐之路:抽象規則

来源:https://www.cnblogs.com/notayeser/archive/2020/02/27/12372955.html
-Advertisement-
Play Games

前言 去年供職於一家電商公司,被分配到做商城營銷體系的開發設計。本文章記錄了我這個小菜鳥在營銷設計中遇到的坑坑窪窪,以及在重構中的思路。 線性思維,線性設計 首先我們列一列營銷組件有哪些 。 滿減 折扣 秒殺 組合購 換購 優惠券 新人有禮 邀請有禮 簽到 紅包裂變 ... 其次是要知道營銷在 正向 ...


前言

  去年供職於一家電商公司,被分配到做商城營銷體系的開發設計。本文章記錄了我這個小菜鳥在營銷設計中遇到的坑坑窪窪,以及在重構中的思路。


線性思維,線性設計

首先我們列一列營銷組件有哪些

  • 滿減
  • 折扣
  • 秒殺
  • 組合購
  • 換購
  • 優惠券
  • 新人有禮
  • 邀請有禮
  • 簽到
  • 紅包裂變
  • ...

其次是要知道營銷在正向流程,即用戶的下單路徑中營銷系統是如何起作用的,當然這隻是簡單的示意圖,實際業務中要複雜許多。

主流程圖

  在這種情況下我選擇了一種“理所應當的設計”,即一種組件對應一個微服務。當然LZ不是說這種設計很糟糕,在營銷需求不多的情況下這種方式能最快出成果。
  其實在營銷組件很多的情況下組件、服務一對一的設計仍有優點,因為符合開閉原則,需求變更再頻繁,也只需對單個組件進行更改,不影響其他組件的正常工作。

編排

  實際上在下游與營銷組件之間我會加一層聚合服務,用來收縮營銷的邊界,統一提供如計價、優惠顯示等能力,避免給系統加入過多的耦合關係。

  這種線性的服務設計能在迭代初期解決大部分問題,但暴露出來的問題也是顯而易見的:

  • 部署成本較高
  • 代碼庫大量duplicate code,且組件之間的表設計有60%-70%相近
  • 一些重要的主流程邏輯其複雜度會隨著組件數量提升而提升,且嚴重依賴於單應用的響應時間,無法降級


重構:凡事都得按‘規則’來

  在接受線性設計所帶來的弊端後,我著手開始重構工作。不得不說這是個困難的工程,淘寶花了十年,經歷6次重構,才實現了不上線就可以加組件,不得不說還是NB。

  重構的方向::抽取共性,合併工程,組件不決定服務。

  從業務中來,還得回到業務中去,和PM零零散散地歸納了現有營銷業務的一些特點,以及將來的需求趨向。可以將現有營銷十幾種組件歸為三類。

營銷組件

  像積分權益、團購、優惠券等後置的營銷活動,屬於邊界清晰、較為獨立的服務,暫時不納入重構的範圍。這次討論的是改價類和組合類這兩種前置營銷,即在結算前發生的營銷活動。

  • 改價類針對單品進行改價,在購物車中直接顯示活動價格。

  • 組合類針對多個商品進行改價,前置條件是1-n個商品通過數量/價格/sku類型 等觸發的優惠,優惠形式也有多種: 直減/贈品/N元換購。

  雖然分為兩類,但這些組件最終的效果都是改變訂單中的物品價格,改價類比較直觀,而贈品和N元換購同樣可以視為將某個商品自動加入到訂單中,並對其改價的行為。

  除了這點,組件們也有很多相同的屬性,如生效時間段、限購、面對的用戶群體、生效的sku範圍等等。

新設計


面向對象的設計:所有依賴關係都終止於抽象類與抽象介面。


  OOP的精神無處不可借鑒。在瞭解到這些共性之後,我們就可以抽象出自己的通用規則模型了,說到模型~~其實像營銷體系這類複雜度較高的系統,實踐DDD是個不錯的選擇~

  在新的設計中,引入規則的概念。如果營銷是類,那麼規則就是這個類的一個實例。一條規則會擁有若幹欄位,按組分類之:

前置條件
  • 用戶資格
  • 目標範圍
  • 門檻量
  • 限購額度
  • 生效時間
  • ...
優惠參數
  • 優惠方式
  • 優惠內容
  • ...
規格
  • 優先順序
  • 類型
  • ...

前置條件決定瞭如何觸發這條規則;
優惠參數決定了觸發後如何針對訂單改價;
規格決定了這條規則的其他屬性:
優先順序用來控制規則之間的計算順序;類型決定了這條規則的業務類型,也就是它代表的是什麼組件,用於分組、互斥和觸發組件的特有行為。


  建表欄位自然也就按以上來參考,基本是一一對應,當然最好是預留一些欄位。不要高估自己的抽象能力,何況你永遠不知道下一個需求有多“驚喜”。必要時也可以建立規則詳情表,容納更多的可能性,總是好的~

  建立好規則表,其他相關的業務表也手到擒來了,如商品關聯表,優惠記錄表等等,這一塊的共性很多,設計起來比較自由,就不贅述了,做好和規則記錄的關聯即可。

  在此基礎上,就可以開始重構業務模塊了,對於一些CURD介面無非就是把庫都集中挪到同一個地方了,比較簡單。難點在於計價模塊,如何通過規則類型來區別化表達這張規則表,從而各種營銷玩法都能準確完成價格計算,這裡我採用了註解驅動的策略模式。實現等到下次在講~


排版不是很好,慢慢進步,peace~



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • css的優先順序之前一直沒怎麼註意沒當回事,總以為對同一元素靠後的渲染會覆蓋前面的渲染,要是覆蓋不了那就來個!important嘛。直到我那在學前端基礎的後端伙伴拿一個問題問住了我,我才意識到這是重點中的重點啊!啪啪啪打臉! 優先順序關係 先來看css為元素添加樣式的幾種規則(優先順序a>b>c>d,!i ...
  • 一、使用.的方式調用對象的屬性 格式:對象名.屬性名(不帶雙引號) 註意:JS對象的屬性標準一般是不用加引號的,加也可以,加了引號時,調用的時候還是要將引號去掉的。特別的情況必須加,如果key數字或者表達式等。引號只是為了表示引號內部的內容是一個整體。 二、使用[ ]的方式調用對象的屬性 格式:對象 ...
  • video在各瀏覽器中顯示的差異 video支持的基本視頻格式:mp4 / webm / ogv <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>video</title> </head> <body> <v ...
  • 【逆戰班】 1.flex佈局 Flexible Box 模型,通常被稱為 flexbox,是一種一維的佈局模型。它給 flexbox 的子元素之間提供了強大的空間分佈和對齊能力。我們說 flexbox 是一種一維的佈局,是因為一個 flexbox 一次只能處理一個維度上的元素佈局,一行或者一列。這裡 ...
  • 兩欄佈局是寫頁面時經常用到的,要想實現兩欄佈局,就需要明白BFC規則,Block formatting context,直譯為“塊級格式化上下文”,可以簡單的理解它為一個獨立的區域,把區域內部元素與外部元素區分開,兩者互不幹擾。它的規則:1.內部元素會在垂直方向一個接一個放置。2.屬於同一個BFC的 ...
  • 記錄怎麼使用text-align與vertical-align屬性設置元素在容器中垂直居中對齊。text-align與vertical-align雖然都是設置元素內部對齊方式的,但兩者的用法還是有略微不同的。在討論這兩者的用法之前,我們首先需要瞭解元素的分類。 塊元素:獨占一行、可設寬高、標準盒模型 ...
  • 圖解Java設計模式之單例設計模式 設計模式介紹 設計模式類型 單例設計模式介紹 餓漢式(靜態常量) 餓漢式(靜態代碼塊) 懶漢式(線程不安全) 懶漢式(線程安全,同步方法) 懶漢式(線程安全,同步代碼塊) 雙重檢查 靜態內部類 枚舉 單例模式註意事項和細節說明 設計模式介紹 1)設計模式是程式員在 ...
  • @RestController RestController是@Controller和@ResponseBody的合併 @EnableAutoConfigurationSpringBoot建議只有一個帶有該註解的類SpringBoot會自動根據jar包的依賴來自動配置項目當項目下麵有HSQLDB的依 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...