基于事件驅(qū)動(dòng)架構(gòu)的用戶成長(zhǎng)體系

背景概述

用戶成長(zhǎng)體系通俗的來(lái)講就是會(huì)員經(jīng)驗(yàn)金幣系統(tǒng),通過(guò)量化的方式來(lái)衡量用戶對(duì)平臺(tái)的忠誠(chéng)度琳钉、共享度等,同時(shí)提供一系列的激勵(lì)機(jī)制蛛倦,刺激用戶留在平臺(tái)上歌懒。簡(jiǎn)單來(lái)講,成長(zhǎng)體系的作用就是“獲客”溯壶、“活客”及皂。

對(duì)于用戶來(lái)說(shuō),一個(gè)好的用戶成長(zhǎng)體系能夠提升用戶的主動(dòng)活躍且改,用戶也可以從體系中獲得成就感验烧、特權(quán)等利益。比如京東的京豆可以用來(lái)抵扣下次消費(fèi)钾虐,QQ超級(jí)會(huì)員能讓用戶享受不一定的尊貴體驗(yàn)。

對(duì)于平臺(tái)來(lái)說(shuō)笋庄,通過(guò)用戶成長(zhǎng)體系可以了解用戶對(duì)產(chǎn)品的使用情況效扫,有助于了解用戶的組成情況,可以作為后面精細(xì)化運(yùn)營(yíng)的基礎(chǔ)直砂。同時(shí)菌仁,成長(zhǎng)體系有利于提高用戶粘性和忠誠(chéng)度,引導(dǎo)用戶產(chǎn)出UGC內(nèi)容静暂,促成用戶評(píng)論济丘、消費(fèi)、拉新等行為洽蛀。

用戶成長(zhǎng)體系不論對(duì)于用戶還是平臺(tái)來(lái)說(shuō)摹迷,都是雙贏的結(jié)果。

系統(tǒng)設(shè)計(jì)

用戶成長(zhǎng)體系通常由經(jīng)驗(yàn)郊供、金幣峡碉、成就三部分構(gòu)成。營(yíng)銷中臺(tái)作為成長(zhǎng)體系的基礎(chǔ)服務(wù)驮审,為成長(zhǎng)體系提供活動(dòng)鲫寄、權(quán)益吉执、數(shù)據(jù)服務(wù)等基礎(chǔ)能力的支撐。

經(jīng)驗(yàn)體系:包含經(jīng)驗(yàn)與等級(jí)相關(guān)的所有功能地来。經(jīng)驗(yàn)管理戳玫,配置經(jīng)驗(yàn)發(fā)放的規(guī)則,如什么事件發(fā)放多少經(jīng)驗(yàn)未斑;等級(jí)管理咕宿,配置等級(jí)的規(guī)則,如共有多少個(gè)等級(jí)颂碧,每個(gè)等級(jí)需要多少經(jīng)驗(yàn)荠列,每個(gè)等級(jí)如何展示(頭像變化、皇冠)等载城;特權(quán)管理肌似,配置每個(gè)特權(quán)相關(guān)的內(nèi)容,以及每個(gè)特權(quán)對(duì)應(yīng)的權(quán)益與用戶等級(jí)诉瓦,如L3用戶可享受5折機(jī)票優(yōu)惠等川队。

成就體系:主要配置成就相關(guān)的規(guī)則,如用戶做什么操作可以獲得什么成就睬澡。成就與經(jīng)驗(yàn)和等級(jí)沒(méi)有直接的關(guān)系固额。

金幣體系:在系統(tǒng)內(nèi)可以流通、兌換權(quán)益的物品煞聪,都可以納入金幣體系斗躏,如金幣、鉆石昔脯、積分啄糙、點(diǎn)券等。兌換管理云稚,配置金幣的價(jià)值隧饼,即多少金幣可以兌換什么權(quán)益;金幣清算與金幣對(duì)賬静陈,要保證金幣與權(quán)益燕雁、商品的一致性,否則可能引起權(quán)益方面的掛賬鲸拥;金幣商城拐格,用于金幣兌換實(shí)際物品或權(quán)益。

成長(zhǎng)體系中經(jīng)驗(yàn)刑赶、金幣禁荒、成就等的計(jì)算過(guò)程,是由其它業(yè)務(wù)系統(tǒng)的消息來(lái)觸發(fā)的角撞,如用戶轉(zhuǎn)發(fā)呛伴、評(píng)論某篇文章勃痴,收藏了某個(gè)商品,支付了某個(gè)訂單等動(dòng)作热康。成長(zhǎng)體系收到消息后沛申,根據(jù)規(guī)則進(jìn)行計(jì)算,給用戶相應(yīng)的獎(jiǎng)勵(lì)姐军。這個(gè)過(guò)程通常是以異步的方式去實(shí)現(xiàn)铁材,成長(zhǎng)體系的處理失敗不應(yīng)引起業(yè)務(wù)操作的失敗,因此消息隊(duì)列是不二的選擇奕锌。對(duì)于沒(méi)有企業(yè)級(jí)通用異步總線的系統(tǒng)著觉,可以通過(guò)一個(gè)proxy代理模塊,將聯(lián)機(jī)調(diào)用轉(zhuǎn)換為內(nèi)部的異步調(diào)用惊暴,使計(jì)算過(guò)程與業(yè)務(wù)調(diào)用解耦(筆者所在項(xiàng)目沒(méi)有通用的異步通訊總線饼丘,因此采用這種模式)。架構(gòu)圖如下所示:

User-service負(fù)責(zé)提供對(duì)客戶端的查詢服務(wù)辽话,如用戶已有的經(jīng)驗(yàn)金幣成就值肄鸽、獲取金幣成就的規(guī)則等。Admin-service負(fù)責(zé)提供業(yè)務(wù)人員的管理服務(wù)油啤,業(yè)務(wù)人員可依據(jù)運(yùn)營(yíng)需求及時(shí)調(diào)整金幣發(fā)放等規(guī)則典徘。Compute-service是計(jì)算引擎,也是用戶成長(zhǎng)體系的核心益咬,它從kafka中獲取用戶的業(yè)務(wù)操作逮诲,計(jì)算應(yīng)給用戶發(fā)放的獎(jiǎng)勵(lì)。

下面主要針對(duì)Compute-service做詳細(xì)的說(shuō)明幽告。

Compute-service的實(shí)現(xiàn)

Compute-service不僅靠kafka的消息事件來(lái)驅(qū)動(dòng)梅鹦,其內(nèi)部也是利用spring事件驅(qū)動(dòng)模型實(shí)現(xiàn)的。

Spring事件驅(qū)動(dòng)模型

本文僅針對(duì)spring的事件驅(qū)動(dòng)模型做簡(jiǎn)單的介紹评腺,更深入的說(shuō)明及用法請(qǐng)讀者自行了解帘瞭。

想要使用Spring的事件模型淑掌,需要了解以下幾個(gè)類:

ApplicationEvent

事件本身蒿讥,繼承自Java EventObject。

ApplicationListener

監(jiān)聽(tīng)者對(duì)象抛腕,能夠選擇監(jiān)聽(tīng)不同的事件Event芋绸,并執(zhí)行相應(yīng)的操作。

ApplicationEventPublisher

事件的發(fā)布者担敌,通過(guò)ApplicationEventPublisher#publishEvent的方法進(jìn)行事件的廣播摔敛。

具體用法如下:

定義事件類型Event

定義事件監(jiān)聽(tīng)器


發(fā)布事件

以上3步即可完成事件驅(qū)動(dòng)業(yè)務(wù)代碼的編寫,spring會(huì)根據(jù)發(fā)布的事件類型全封,找到相應(yīng)的事件監(jiān)聽(tīng)器马昙,執(zhí)行onApplicationEvent()方法桃犬。

Compute-service的內(nèi)部流程圖如下:


圖中成就、權(quán)益相關(guān)的處理流程與經(jīng)驗(yàn)和金幣類似行楞,不再詳細(xì)畫出攒暇。

從kafka中獲取消息后的處理流程如下:

為防止消息重復(fù)消費(fèi),必須要保證消息處理的冪等性子房,即同一個(gè)消息至多消費(fèi)一次形用。每個(gè)消息都由生產(chǎn)者生成一個(gè)唯一標(biāo)識(shí),消費(fèi)者在消費(fèi)時(shí)证杭,將userId+唯一標(biāo)識(shí)作為key存入redis田度,并設(shè)置過(guò)期時(shí)間為24小時(shí)(即24內(nèi)沒(méi)有重復(fù)消息,即可認(rèn)為沒(méi)有重復(fù)消息產(chǎn)生解愤,過(guò)期時(shí)間可依據(jù)實(shí)際業(yè)務(wù)情況調(diào)整)镇饺。消費(fèi)者接收到新的消息時(shí),到redis里查下是否存在相應(yīng)的key琢歇,若存在兰怠,即是重復(fù)消息,直接拒絕即可李茫。

由規(guī)則選擇器判定是否需要產(chǎn)生spring事件揭保。規(guī)則選擇器是我們定義的接口,match方法用于匹配規(guī)則魄宏,message是業(yè)務(wù)系統(tǒng)發(fā)來(lái)的消息內(nèi)容秸侣,assemblyEvent方法用于組裝event事件。如下:

具體用法舉例宠互,我們定義了日常任務(wù)味榛,用戶每天可通過(guò)閱讀文章來(lái)獲得經(jīng)驗(yàn)值。這樣就可以定義一個(gè)DailyTaskRuleSelector予跌,match方法的實(shí)現(xiàn)為從數(shù)據(jù)庫(kù)中檢索搏色,閱讀文章是否在日常任務(wù)的列表中,在的話即發(fā)布一個(gè)經(jīng)驗(yàn)事件券册。

發(fā)布事件的代碼如下:

3. Spring事件驅(qū)動(dòng)機(jī)制會(huì)自動(dòng)根據(jù)事件類型频轿,執(zhí)行相應(yīng)監(jiān)聽(tīng)器的業(yè)務(wù)邏輯。


在實(shí)際業(yè)務(wù)處理過(guò)程中烁焙,經(jīng)驗(yàn)與金幣等并不是完全獨(dú)立的航邢,會(huì)有一定的相互作用。如在用戶累加經(jīng)驗(yàn)觸發(fā)用戶等級(jí)的提升時(shí)骄蝇,通常會(huì)給用戶獎(jiǎng)勵(lì)一些金幣膳殷,或者發(fā)放一些權(quán)益。

這種情況下九火,為保證職責(zé)分離赚窃,維護(hù)代碼的簡(jiǎn)潔性册招,不能在經(jīng)驗(yàn)事件監(jiān)聽(tīng)器中去做金幣和權(quán)益的處理邏輯±占可以有以下兩種做法:

在經(jīng)驗(yàn)的處理過(guò)程中跨细,如果用戶升級(jí)則發(fā)布一條用戶升級(jí)事件,有專門的升級(jí)事件處理器去處理用戶升級(jí)所帶來(lái)的獎(jiǎng)勵(lì)河质。這種做法需要升級(jí)處理器了解金幣和權(quán)益在用戶升級(jí)過(guò)程中的處理細(xì)節(jié)冀惭,會(huì)破壞代碼的獨(dú)立性。在業(yè)務(wù)規(guī)則相對(duì)復(fù)雜的情況下掀鹅,不建議使用該做法散休。

在經(jīng)驗(yàn)處理器中,用戶升級(jí)后乐尊,查詢對(duì)應(yīng)的等級(jí)有無(wú)金幣獎(jiǎng)勵(lì)戚丸,若有,則發(fā)布金幣事件扔嵌,事件內(nèi)容為用戶升級(jí)限府,由金幣處理器依據(jù)事件內(nèi)容做詳細(xì)的處理。權(quán)益發(fā)放也是如此痢缎。此做法會(huì)使經(jīng)驗(yàn)處理器中包含一部分金幣與權(quán)益規(guī)則判定的內(nèi)容胁勺,但由于通常判定獎(jiǎng)勵(lì)規(guī)則的有無(wú)比較簡(jiǎn)單,可以放在經(jīng)驗(yàn)處理器中独旷;而規(guī)則的具體執(zhí)行與檢查邏輯相對(duì)復(fù)雜署穗,需要相應(yīng)的選擇器去執(zhí)行,如金幣是否超上限嵌洼、同一種權(quán)益是否重復(fù)發(fā)放等案疲。筆者所在的項(xiàng)目就是采用該做法。

如何擴(kuò)展

實(shí)際場(chǎng)景中麻养,隨著產(chǎn)品的迭代褐啡,業(yè)務(wù)規(guī)則會(huì)越來(lái)越復(fù)雜,功能也在不斷的增加鳖昌,對(duì)代碼的可維護(hù)性和可擴(kuò)展性提出了較高的要求备畦。基于此事件驅(qū)動(dòng)設(shè)計(jì)的架構(gòu)遗遵,可通過(guò)增加規(guī)則選擇器RuleSeletor和事件處理器EventListener萍恕,即可實(shí)現(xiàn)對(duì)新的業(yè)務(wù)功能的支持逸嘀,原有功能及代碼無(wú)需改動(dòng)车要。

有些公司會(huì)基于成本、復(fù)用等方面的考慮崭倘,要求用戶成長(zhǎng)體系同時(shí)支持多條業(yè)務(wù)線的發(fā)展翼岁。但每條業(yè)務(wù)線上的經(jīng)驗(yàn)类垫、金幣等規(guī)則各不相同,不能因?yàn)檐浖a(chǎn)品的復(fù)用而要求業(yè)務(wù)規(guī)則統(tǒng)一琅坡。

此時(shí)可通過(guò)kafka的topic區(qū)分不同的業(yè)務(wù)線悉患,每一條業(yè)務(wù)線單獨(dú)配備一套用戶成長(zhǎng)體系集群,每個(gè)集群的規(guī)則單獨(dú)配置榆俺,互不影響售躁,如下圖:


總結(jié)

用戶成長(zhǎng)體系是“獲客”、“活客”的重要手段茴晋,通常由經(jīng)驗(yàn)陪捷、金幣、成就三部分構(gòu)成诺擅。

用戶成長(zhǎng)體系應(yīng)與業(yè)務(wù)系統(tǒng)解耦市袖,通過(guò)消息隊(duì)列實(shí)現(xiàn)異步通訊,通過(guò)消息對(duì)列的發(fā)布/訂閱機(jī)制和spring的事件驅(qū)動(dòng)模型烁涌,實(shí)現(xiàn)整個(gè)系統(tǒng)的事件驅(qū)動(dòng)設(shè)計(jì)苍碟。

系統(tǒng)內(nèi)部各模塊之間的關(guān)聯(lián),也是通過(guò)事件觸發(fā)撮执,減少模塊之間的直接依賴微峰,提高代碼的簡(jiǎn)潔性。

可通過(guò)擴(kuò)展系統(tǒng)內(nèi)部spring的事件類型與處理器實(shí)現(xiàn)業(yè)務(wù)功能的擴(kuò)展抒钱;也可通過(guò)對(duì)kafka的topic的拓展县忌,以同時(shí)支持多個(gè)業(yè)務(wù)線的發(fā)展。


歡迎關(guān)注公眾號(hào):程序員順仔继效,回復(fù)【資料】症杏,即可獲得多本架構(gòu)進(jìn)階電子書籍。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瑞信,一起剝皮案震驚了整個(gè)濱河市厉颤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凡简,老刑警劉巖逼友,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秤涩,居然都是意外死亡帜乞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門筐眷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)黎烈,“玉大人,你說(shuō)我怎么就攤上這事≌掌澹” “怎么了资溃?”我有些...
    開(kāi)封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)烈炭。 經(jīng)常有香客問(wèn)我溶锭,道長(zhǎng),這世上最難降的妖魔是什么符隙? 我笑而不...
    開(kāi)封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任趴捅,我火速辦了婚禮,結(jié)果婚禮上霹疫,老公的妹妹穿的比我還像新娘驻售。我一直安慰自己,他們只是感情好更米,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布欺栗。 她就那樣靜靜地躺著,像睡著了一般征峦。 火紅的嫁衣襯著肌膚如雪迟几。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天栏笆,我揣著相機(jī)與錄音类腮,去河邊找鬼。 笑死蛉加,一個(gè)胖子當(dāng)著我的面吹牛蚜枢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播针饥,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼厂抽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了丁眼?” 一聲冷哼從身側(cè)響起筷凤,我...
    開(kāi)封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苞七,沒(méi)想到半個(gè)月后藐守,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹂风,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年卢厂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惠啄。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慎恒,死狀恐怖任内,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巧号,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布姥闭,位于F島的核電站丹鸿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏棚品。R本人自食惡果不足惜靠欢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铜跑。 院中可真熱鬧门怪,春花似錦、人聲如沸锅纺。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)囤锉。三九已至坦弟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間官地,已是汗流浹背酿傍。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驱入,地道東北人赤炒。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像亏较,于是被迫代替她去往敵國(guó)和親莺褒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359