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

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...