通用營銷抽獎系統架構設計與實踐

2021-02-23 之家技術


背景

營銷類業務中經常有一些抽獎活動類的玩法,如大轉盤、紅包雨、老虎機、搖一搖等。在業務支持過程中,經常遇到需求頻繁變更,定製化需求多等問題。 

比如某次抽獎需求:

1.每個用戶都有多次抽獎機會,但每次的概率又不同;

2.抽獎活動周期內,為控制預算並保證活動效果,對每天的獎品數量進行控量;

3.為應對「非正常」用戶,在每天指定的時間段,降低中獎概率;

4.……

等等的此類抽獎玩法需求,每場抽獎活動形式大同小異,但背後的業務需求又存在差異,定製化程度特別高。

早期我們的處理方式是每次都針對需求重新開發,那時需求較為簡單,抽獎活動數量也較少。隨著業務規模日益擴大,抽獎活動頻率越來越高,我們先開發一套簡單的配置式後臺,支持簡單的獎品和概率的配置。

但是實際使用中,也有一些問題,比如:

1.差異化抽獎規則很多,根本無法通過簡單的概率配置,滿足業務需求,定製化成本很高;

2.對於大型專題中抽獎活動的並發控制、數據一致性等提出很多挑戰;

3.兄弟業務線也有類似的需求,但基本需要重新實現一遍,系統復用性很低。

考慮到以上問題,加之抽獎玩法是一個相對獨立、應用場景廣泛的業務,於是我們開發一套通用的抽獎系統,提供系統級業務復用的能力,系統單獨維護、單獨部署,保證通用性和可伸縮性。下面從:

等幾個方面介紹一下這個系統。

為保證整體的靈活性,本系統採用領域模型驅動設計(DDD),對系統中不同業務模塊進行抽象:

上圖中的業務概念:

活動:抽獎活動的主體,多數場景下,一場抽獎活動就是一個活動對象。

輪次:與活動是一對多的關係,例如:一場秒殺活動,可能有多個場次,多個場次可以只報名一次,但每個場次的獎品又不同。類似場景,可以採用多個輪次解決。

輪次獎品:多輪抽獎,獎品雖然一樣,但是概率不同。於是引入輪次獎品的概念,不同輪次就可以針對同一個獎品,設置不同的概率。庫存同理,在輪次+獎品的維度維護其對應關係,而不是直接綁定在獎品上。不同輪次可選相同的獎品、不同的庫存。

概率組:多條抽獎概率信息,組成一個概率組,如:用戶首次抽獎,中獎概率是50%,第2到第5次抽獎,中獎概率提高為70%,於是系統把概率獨立出來,並引入概率組的概念。這樣就可以在一個概率組裡配置兩條概率,一條是第1次的概率50%,一條是第2到第5次的概率為70%。

中獎規則:描述每次抽獎行為響應結果的方式,比如:活動周期內,用戶有3次抽獎機會,但是只能中獎1次,即:之前中過獎,就不能再中。這時通過把中獎規則獨立出來,並且在抽獎活動和輪次上都關聯中獎規則,這樣創建一個抽3次中1次的中獎規則,然後在抽獎活動和輪次都選這個規則,從而實現需求。

反作弊規則:抽獎活動經常面臨被一些黑產薅羊毛的處境,識別正常用戶和非正常用戶的成本較高,且較難保證準確。雖然前端可以通過圖片驗證碼、簡訊驗證碼等方式來提高門檻,但是道高一尺魔高一丈,還是有被突破的風險。因此本系統引入反作弊規則的概念,在特定用戶、時間段等維度,對抽獎行為進行限制。

回調規則:作為一個獨立系統,其他業務系統調用抽獎後,可能需要做記錄中獎信息,發送簡訊等異步處理,於是加入異步回調功能。

業務實體模型如下:

系統實現過程如下:

1. 根據設計的模型,為每一個實體定義接口和一個工廠類,通過接口只暴露行為,工廠類依據不同的類型屬性,去構建對應的實例。不同類型的實現類可以根據需要使用不同的屬性欄位去實現功能。

2.在進行一次抽獎時,需要明確到某一個輪次,構建一個抽獎輪次,除了輪次數據外,還有抽獎活動、獎品等其他數據,顯然多次資料庫查詢性能肯定不能滿足接口要求,因此我們引入自主開發的分布式實時內存緩存組件,提升查詢性能的同時,也保證了數據的實時性。

3. 當構建好一個輪次實例後,便開始處理抽獎流程,過程依次分為:前置驗證、執行抽獎邏輯、後置驗證、入庫、返回結果五個步驟:

A. 前置驗證:主要基於Redis,包括抽獎規則驗證,風控驗證,庫存驗證。B. 執行抽獎邏輯:根據輪次的輪次獎品集合進行抽獎。實現上,採用離散算法,實現按權重進行抽獎的邏輯,主要包括三種情況:

第二種,概率之和小於1:

即P1+P2+P3<1,由此計算出為中獎概率1-P2-P2-P3=0.1,若random落在0.9-1中間,則未中獎,落在其他區間,則命中對應的獎品

第三種,概率之和大於1:

即P1+P2+P3>1,此類情況則為100%中獎,每個獎品的權重按概率之和的佔比計算,如P1的權重計算公式為:P1/(P1+P2+P3)。

用實際數字舉例:P1權重= 20/(20+40+60) = 0.16,然後取隨機數判斷中獎結果。

C. 後置驗證:由於價值類獎品存在隨機問題(如:現金紅包有不同金額),只有在抽中之後才會明確價值,因此需要後置驗證庫存,防止超賣問題。系統設計上,支持活動和獎品共用庫存,此處分兩種情況,共用庫存時,只驗證統一庫存;非共用時,需同時驗證活動庫存和獎品庫存,此處驗證同樣基於Redis。

D. 入庫:保存中獎記錄並扣減庫存,需保證在一個事務中執行,以保證數據完整性和一致性,同時這裡利用資料庫鎖進行庫存扣減,防止庫存超賣。

E. 返回結果:中獎結果響應包括實時與異步兩種,實時結果返回一些簡要信息,異步結果返回詳細中獎信息,供調用方後續處理。

系統只保存中獎用戶記錄,防止大量無效抽獎記錄信息擠佔資料庫資源。同時在抽獎過程中,每一個中斷處(所有導致未中獎而退出的地方)異步記錄抽獎日誌,便於問題排查。

為保證良好的擴展性,上述業務對象在實現時都增加了類型欄位(如圖3),通過策略模式實現。如庫存早期只有兩種類型,後來業務需求指定日期設置庫存數量,只需要增加一種按日期設置次數的庫存類型,實現一個對應的子類即可,其他邏輯保持不變。

前文介紹的大部分系統概念都是採用這種實現方式,若有新的需求接入,可增加新的實現類,然後進行重新組合,系統的擴展採用「重新組合「的方式替代原有的」邏輯調整「。最終業務中約90%的場景都可以通過配置來實現,剩下的10%也可以通過在某一個對象或者多個對象增加類型來快速支持。

系統經歷了兩次汽車之家818百城車展、及多次大訪問量業務考驗,這歸功於系統在並發能力上的優化。

在接入層,系統對接了汽車之家API網關,對於請求進行限流,特別是直播間秒殺大額獎品的情況,瞬時流量可能達到數萬QPS。這種情況下,對於非預期內的超量請求,直接返回預設中獎結果。

在應用層,對性能也有較高要求。一是查詢性能,需要支持在多個業務系統的展示,二是抽獎操作的性能,要做抽獎資格校驗、抽獎次數校驗、中獎次數校驗、庫存校驗、中獎規則校驗等。考慮到獎品配置等信息變動頻率低,訪問頻次高,變化時要求及時生效,系統引入了支持本地緩存實時更新的基礎數據組件,將獎品配置信息緩存在了應用本地緩存中,後臺修改時會觸發MQ廣播消息,實現緩存實時更新,既保證性能,又保證及時更新。

獎品配置信息緩存在本地緩存中,查詢性能基本得到了保證。對於抽獎操作,除了要獲取獎品配置信息,還需要做抽獎基礎規則校驗、抽獎資格校驗、抽獎次數校驗、中獎次數校驗、庫存校驗、反作弊規則校驗、二次庫存校驗(金額類的庫存,本次中獎金額+已中獎金額<=總金額),這些校驗中用到的配置信息可以從本地緩存拿到,用戶資格、抽獎次數、中獎次數等都存到Redis中,以此保證抽獎操作的性能。

為了方便業務方使用,我們搭建了一個獨立的後臺管理系統。

主要功能包括:抽獎活動創建和編輯,抽獎記錄維護等。

另外,對於一些常見的抽獎活動玩法(比如:大轉盤、紅包雨等),我們開發了抽獎活動玩法庫(抽獎活動類型不斷更新中),如下圖5。

業務組件基於VUE開發,組件通過綁定抽獎活動Id,可以實現自動加載抽獎活動配置的獎品、UI樣式等。開發人員對接這些抽獎活動玩法時,僅需要引入相應的VUE抽獎活動組件即可使用整套抽獎系統。

抽獎活動的獎品和概率配置完全在管理後臺進行維護,這部分工作可以由運營或者產品同學去完成,這樣就實現了職責分離。開發只需要關心組件需要加載哪個抽獎活動信息即可,不用關心獎品,中獎概率。甚至組件的樣式和文案都不用關心,因為樣式和文案也可以通過後臺系統配置。產品和運營可以在抽獎活動上線後,在不需要開發介入的情況下,隨時對產品需求進行變更。

為了更好的理解以上內容,我們將整個系統完整的內容展示在下圖中:

上線不到一年時間,目前該系統已經完整支持了幾百場抽獎活動,累計抽獎千萬次,整體運行穩定。

我們的系統也提供了抽獎活動全流程的支持,運營後臺、服務端應用、UI前端組件、獎品發放及最後統計報表,用戶可以靈活選擇其中的全部或者部分流程使用到自己的業務中。我們在系統的使用過程中,文章開頭提到的痛點問題,基本都得到了解決。

1. 提供了:概率(組)、中獎規則、反作弊規則等概念,靈活支持各種多變的需求,並在代碼層面採用策略模式進行抽象,方便系統擴展;

2. 使用網關實現流量控制,系統層面,借用Redis+DB雙查詢方式,保證實時性和可靠性;

3. 完整的Saas平臺加UI組件的模式,基本實現百分百復用,目前部門內部有多個業務使用我們的系統,節約大量開發工作的同時,快速支持業務。

相關焦點

  • 架構設計
    計算機科學歸根到底屬於工程技術類,實踐第一。設計模式類這一類圖書則一下子進入架構的局部細節,每個模式的來龍去脈並不容易理解。就算理解了某個具體的模式,但是也很難真正做到活學活用,不知道還是不知道。分布式系統架構設計類這類圖書通常從服務端的通用問題如一致性、高可用、高並發挑戰等話題講起,講大型業務系統面臨的挑戰。
  • ActiveMQ架構設計與實踐,需要一萬字
    就這麼一個重量級的東西,在很多公司尾大不掉,具體架構設計讓我為你娓娓道來。或許你應該從人性上,而不是技術上,來考慮一下它的存在性。以下是正文。1、架構設計概要ActiveMQ提供兩種可供實施的架構模型:「M-S」和「network bridge」;其中「M-S」是HA方案,「網絡轉發橋」用於實現「分布式隊列」。
  • ITIL 4 知識解析系列之二:架構管理實踐
    ITIL 4 通用管理實踐此部分由於具有一定的通用性,因此所涉及到的實踐比較偏向於企業宏觀層面,統領後面的各項IT服務與技術。ITIL4 包含14個通用管理實踐,而且每個通用管理實踐都可以展開成上海信息化培訓中心SITC另一門培訓。
  • 軟體項目實訓及課程設計指導——系統設計中的系統架構設計示例
    軟體項目實訓及課程設計指導——軟體系統設計中的系統架構設計示例1、軟體系統概要設計中所涉及的主要設計內容和工作過程(1)在軟體應用系統項目的系統概要設計工作中,首先是要完成軟體系統的總體架構設計及系統的分層設計,然後再利用UML包視圖體現出軟體系統架構設計的最終結果
  • 揭秘:騰訊阿里京東推薦系統架構如何設計?
    至此,在10月21日的搜索及推薦系統架構設計專場中,有五位演講嘉賓對他們熟悉的推薦系統架構技術進行了分享,他們分別是來自第四範式資深算法科學家程曉澄、騰訊音樂娛樂集團技術總監李深遠、58轉轉搜索推薦部負責人張相於、阿里巴巴高級技術專家鄧萬禧、京東集團架構師尹德位。《推薦系統架構演進的實戰分享》首先為大家介紹今天的第一位演講嘉賓來自第四範式資深算法科學家程曉澄。
  • 微服務架構設計實踐總結和思考
    本文談談在微服務架構設計中的一些實踐和思考。對於SOA和微服務,我前面很多文章都進行了詳細的闡述,今天這篇文章重點還是放在一些架構設計和實踐的一些關鍵點思考上面。微服務架構思想符合當前複雜應用系統分而治之的思想,這個和微服務出來前的組件化開發思路是一致的,只是微服務思想出來後對於拆分的微服務更加高度解耦和獨立自治。比如一個傳統的大業務系統,類似ERP,合同管理等,業務系統足夠複雜,需要考慮進行分為治之方便後期管理和擴展。其次是非功能性需求導致的複雜性,比如一個業務系統功能並不多,但是文件存儲和獲取量巨大,那麼文件服務就需要單獨拆分為微服務。
  • 什麼是大轉盤抽獎系統?
    隨著產品銷售渠道的轉變,為產品營銷帶來了更多的機會。大轉盤抽獎系統開發作為一種適合各個行業營銷的工具和手段,能根據環境,產品特性等進行即時性的動態修正,使營銷價值得到增值。大轉盤抽獎系統開發,不僅能幫助企業更實時、高效、準確、可靠地實現產品質量管理,更能不斷吸引消費者來參與互動的方式,產品不再局限於產品的物化屬性,而延伸向更多的社會屬性,將消費者擺在最重要的位置,以消費者需求為導向不斷強化品牌及產品參與感。
  • 分布式系統架構與雲原生—阿里雲《雲原生架構白皮書》導讀
    1 雲原生與分布式系統架構的關係  1.1 雲原生架構的定義  《雲原生架構白皮書》中對於雲原生架構的定義為「基於雲原生技術的一組架構原則和設計模式的集合,旨在將雲應用中的非業務代碼部分進行最大化的剝離,從而讓雲設施接管應用中原有的大量非功能特性(如彈性、韌性、
  • 大規模異構數據並行處理系統的設計、實現與實踐
    大規模異構數據並行處理系統的設計、實現與實踐夏正勳, 羅聖美, 孫元浩, 唐劍飛, 張燕星環信息科技(上海)有限公司,上海 200233論文引用格式:夏正勳, 羅聖美,等.大規模異構數據並行處理系統的設計、實現與實踐[J].大數據, 2020, 6(4):18-29.
  • Uber下一代支付平臺的系統架構設計
    遺留系統有兩個內部系統。一個向乘客和Uber Eats(優步優食)用戶收取費用,另一個向餐館和合作夥伴司機支付費用。這個遺留系統有很多缺點,例如對於端到端的資金流動就沒有整體看法。它還拖慢了構建更通用功能的進程,比如Cash Trips、Uber需要從其他司機合作夥伴那裡收取佣金等等。因此,我們希望構建一個與角色無關的系統,可以從任何用戶收付資金。
  • 軟體項目實訓及課程設計指導——如何實現面向服務的系統架構設計
    軟體項目實訓及課程設計指導——如何實現面向服務的系統架構設計1、什麼是基於SOA的軟體系統架構(1)什麼是面向服務的軟體系統體系架構所謂的SOA(Service-Oriented Architecture,面向服務的軟體系統體系架構
  • 從分而治之的思想到架構的設計
    隔離級別越大,說明打通隔離越困難,修改調整越困難,但同時也意味著設計的架構越容易被遵守。因此當你堅信架構劃分正確,不同部分需要儘可能分割時,可以採用基於進程甚至更高級別的隔離。但對於業務變化依然很大,邊界不清晰,難以把握全局時,採用不同進程隔離或者不同jar的隔離可能就不合適,因為架構依然可能還需要調整,如果已經拆分了進程、jar那麼架構調整的難度將大幅增加。
  • 架構設計的四大思維支柱
    大家可能會覺得架構管理軟體更重要、更直接,但是架構管理軟體是根據架構設計方法論和架構設計實踐做出來的,所以方法論和模型資產是更重要的基礎性工具,而以目前架構設計的「混亂」現狀而言,沒有通用的架構管理工具也是必然的,因為公認能普適的架構理論和行業級標準化的模型資產都沒有,也就沒有合適的、可以真正直達「痛處」架構管理工具,如果能做出這樣的工具,那麼,一定可以開闢一個世界級的市場
  • 如何做好新一代企業架構的頂層設計
    首先通過綜合評估企業現狀,分析業務需求,對標業界實踐等任務,發現業務價值,找準業務架構轉型突破口,其主要工作包括現狀與問題調研、業務需求理解、業界最近實踐對標、技術發展趨勢分析以及業務轉型的價值發現等。
  • 抽獎系統設計的好壞,一個上天、一個入地
    編輯導語:以前經常在超市看見有抽獎活動,拿著小票去抽獎箱抽獎,一般獎品為優惠券,這也是超市對用戶的一種運營方式,刺激二次消費;如今網際網路時代,大都採用網上的抽獎系統進行抽獎。本文作者介紹了微信抽獎系統的設計方案,希望對你有所啟發。
  • 閱讀架構和權限方面的書籍,更好的輔助設計產品
    主要從大型網站架構的特點,架構目標(高性能,高可用,可伸縮等)基本理論講起,並介紹了幾個很有特色的案例。之前群內分享的大型網站架構系列的基礎理論大部分出自此書。 第二本:《大型網站系統與Java中間件實踐》同樣出自阿里的技術牛人。此書對分布式系統的演進做了較好的介紹。
  • ...實踐分享2:SaaS租戶、資金帳戶、財務帳套、記帳及對帳系統架構...
    本文作者從實際工作實踐出發,結合案例等分享了電商金融支付財務融合中的基本概念和相關原理解析,包括:SaaS租戶、資金帳戶、財務帳套、記帳及對帳系統架構設計,與大家分享,希望通過此文能夠加深你對金融支付財務相關業務的認識。
  • LTpowerPlanner:一種系統級電源架構設計工具
    簡便易用的系統級設計工具可滿足這種需求。Dmoednc什麼是 LTpowerPlanner 工具?LTpowerPlanner 程序是一種系統級電源樹設計工具,幫助系統設計師規劃、設計和優化電源管理系統。該程序提供一個簡便易用的圖形用戶界面 (GUI),極大地簡化了系統級設計任務。
  • 京東架構師閆文廣:訂單系統高可用架構及演變過程
    上面說到了營銷的一些管理系統,其實營銷還有一些後端的基礎服務系統,比如優惠券、滿減、秒殺、首單等。這樣設計有一個好處,比如像大促時可能會有大量數據一下子下發到訂單生產系統,對訂單生產庫有很大壓力,所以我們中間設計出一個管道,通過異步任務來分發生產訂單。
  • 什麼是微內核架構設計?
    阿里妹導讀:作為一名Java程式設計師,相信同學們都聽說過微內核架構設計,也有自己的理解。那麼微內核是如何被提出來的?微內核在作業系統內核的設計中又有什麼作用?本文從插件化(Plug-in)架構的角度來詮釋微內核架構設計,通過微內核架構和微服務架構的對比,分享其對微服務設計的參考意義。