客戶標(biāo)簽系統(tǒng)的設(shè)計(jì)


客戶標(biāo)簽系統(tǒng)架構(gòu)設(shè)計(jì)

一隔箍、項(xiàng)目背景

? ? 為了幫助某個(gè)公司精準(zhǔn)營(yíng)銷谓娃,通過大數(shù)據(jù)分析,對(duì)客戶畫像蜒滩,對(duì)產(chǎn)品畫像滨达,輸出客戶標(biāo)簽,產(chǎn)品標(biāo)簽俯艰。當(dāng)某位客戶進(jìn)入系統(tǒng)時(shí)捡遍,根據(jù)客戶的標(biāo)簽及產(chǎn)品的標(biāo)簽實(shí)時(shí)匹配規(guī)則,向客戶推薦合適的產(chǎn)品竹握。這里要解決的是:如何設(shè)計(jì)一個(gè)合適的應(yīng)用系統(tǒng)及存儲(chǔ)方案画株,可以滿足上述標(biāo)簽的存儲(chǔ)與更新、規(guī)則的制定與運(yùn)算啦辐,從而實(shí)現(xiàn)實(shí)時(shí)的向客戶推薦產(chǎn)品谓传。

? ? 營(yíng)銷團(tuán)隊(duì)的營(yíng)銷經(jīng)理期望可以自由的制定營(yíng)銷規(guī)則。而這些規(guī)則涉及到客戶的信息芹关,客戶的標(biāo)簽续挟,產(chǎn)品的標(biāo)簽。營(yíng)銷經(jīng)理已經(jīng)習(xí)慣了導(dǎo)入導(dǎo)出白名單(由于某些信息系統(tǒng)不完備而導(dǎo)致的手工操作)侥衬。公司現(xiàn)在的存量客戶是1000萬庸推,業(yè)務(wù)團(tuán)隊(duì)規(guī)劃三年后客戶數(shù)量能達(dá)到5000萬常侦。在售的產(chǎn)品數(shù)量不會(huì)超過100款弟断,更新頻率低多搀。

? ? 某位客戶的標(biāo)簽可能是這樣的:性別:男;年齡:青年喜鼓; 職業(yè):IT际乘; 收入:白領(lǐng)坡倔。而某個(gè)理財(cái)產(chǎn)品的標(biāo)簽可能是這樣的:產(chǎn)品風(fēng)險(xiǎn):中; 準(zhǔn)入門檻:低脖含; 起購(gòu)金額:1000元罪塔。這種形式的標(biāo)簽種類(即key的數(shù)量)現(xiàn)在生效的數(shù)量是150個(gè),業(yè)務(wù)團(tuán)隊(duì)規(guī)劃三年后標(biāo)簽的有效種類可能達(dá)到800個(gè)养葵。

????業(yè)務(wù)團(tuán)隊(duì)所說的標(biāo)簽征堪,并沒有一個(gè)來自于業(yè)務(wù)團(tuán)隊(duì)的明確定義,有時(shí)候標(biāo)簽是像上面所說的关拒,產(chǎn)品風(fēng)險(xiǎn):中佃蚜; 準(zhǔn)入門檻:低。有時(shí)候則是指類似于客戶的月收入21300元這樣的一些連續(xù)的數(shù)值着绊,在公司的某個(gè)系統(tǒng)M里甚至是將住址谐算、登陸次數(shù)這樣的信息也在數(shù)據(jù)庫(kù)表里設(shè)計(jì)成標(biāo)簽。這個(gè)系統(tǒng)M的標(biāo)簽表是傳統(tǒng)的設(shè)計(jì)归露,每一個(gè)標(biāo)簽就是一列洲脂,所以系統(tǒng)M的客戶標(biāo)簽表已經(jīng)成了一張超大的表,目前已有120個(gè)字段左右剧包,成一個(gè)稀疏矩陣恐锦,行數(shù)與列數(shù)都非常多,性能已嚴(yán)重跟不上需要疆液,功能擴(kuò)展也無法滿足業(yè)務(wù)團(tuán)隊(duì)的需要踩蔚。每當(dāng)定義一個(gè)新的標(biāo)簽時(shí),就需要變更數(shù)據(jù)庫(kù)枚粘,在這張表上增加一個(gè)字段。所以需要一些新的思路重新設(shè)計(jì)客戶標(biāo)簽系統(tǒng)飘蚯。

二馍迄、初步分析

? ? 對(duì)業(yè)務(wù)場(chǎng)景與標(biāo)簽數(shù)據(jù)進(jìn)行初步分析后,一個(gè)很關(guān)鍵的問題是局骤,應(yīng)當(dāng)如何理解業(yè)務(wù)團(tuán)隊(duì)所說的“標(biāo)簽”呢攀圈?

1、一個(gè)新的思路是只將可枚舉的值才認(rèn)為是標(biāo)簽峦甩,標(biāo)簽的值是可以窮舉的赘来。例如“年收入”可以打成標(biāo)簽值30-50萬现喳,但不能是具體的“31萬”。客戶的標(biāo)簽應(yīng)當(dāng)區(qū)別于客戶的屬性犬辰,是經(jīng)過分析后定性的不是定量的嗦篱。即每一種類的標(biāo)簽有一個(gè)標(biāo)簽名+若干個(gè)可窮舉的值。對(duì)于同一個(gè)標(biāo)簽不同的值幌缝,值的類型是確定的灸促。?而客戶的屬性可以是連續(xù)型的數(shù)值或字符串,例如住址涵卵,月收入(可以精確到分)浴栽。

2、當(dāng)前存在大量的標(biāo)簽是布爾類型值的轿偎;例如某個(gè)客戶標(biāo)簽:“是否黃金類理財(cái)產(chǎn)品的老客戶:是”典鸡。 多數(shù)標(biāo)簽的枚舉值在15個(gè)以內(nèi)。?

3坏晦、負(fù)責(zé)營(yíng)銷的業(yè)務(wù)團(tuán)隊(duì)制定一些營(yíng)銷規(guī)則時(shí)萝玷,有些規(guī)則不僅僅涉及客戶的標(biāo)簽,還會(huì)涉及客戶一些連續(xù)數(shù)值的屬性英遭,例如:資產(chǎn)金額间护,年齡,登陸次數(shù)挖诸。甚至可能需要對(duì)如家庭地址汁尺、電話號(hào)碼這樣的信息進(jìn)行字符串處理。

4多律、營(yíng)銷過程中有時(shí)會(huì)導(dǎo)入白名單痴突,一個(gè)白名單可能最多會(huì)有10萬個(gè)客戶,不同的白名單有不同的用途狼荞。系統(tǒng)需要保存這些白名單以供規(guī)則運(yùn)算辽装。例如某款產(chǎn)品允許/不允許這個(gè)白名單內(nèi)的人購(gòu)買。

5相味、一個(gè)客戶可能會(huì)有某些標(biāo)簽拾积,但不一定會(huì)有。每個(gè)客戶有哪些標(biāo)簽是不確定的丰涉,并且某個(gè)客戶的標(biāo)簽數(shù)量可能很多拓巧,可能很少。通常為30+個(gè)至100+個(gè)一死。

三肛度、分析用例場(chǎng)景

(一)主要用例場(chǎng)景:

1、客戶在訪問產(chǎn)品列表時(shí)投慈,系統(tǒng)需要根據(jù)客戶的標(biāo)簽及產(chǎn)品的標(biāo)簽進(jìn)行實(shí)時(shí)規(guī)則運(yùn)算承耿。

2冠骄、營(yíng)銷過程中有時(shí)需要導(dǎo)入或者導(dǎo)出白名單,或者導(dǎo)出符合一定規(guī)則的客戶名單加袋。

3凛辣、需要有一個(gè)后臺(tái)管理界面,提供給運(yùn)營(yíng)人員配置或者修改規(guī)則锁荔。

4蟀给、標(biāo)簽的種類過多,為了運(yùn)營(yíng)人員可以有效的利用標(biāo)簽設(shè)置規(guī)則阳堕,需要對(duì)標(biāo)簽進(jìn)行分類管理跋理。

5、標(biāo)簽是根據(jù)歷史數(shù)據(jù)(T-1天)恬总,或當(dāng)前事件(T+0天)進(jìn)行計(jì)算的前普。大數(shù)據(jù)平臺(tái)可以綜合分析歷史數(shù)據(jù),計(jì)算客戶的標(biāo)簽壹堰。但由于客戶的數(shù)量比較龐大拭卿,計(jì)算出來的標(biāo)簽數(shù)量更是龐大。大數(shù)據(jù)平臺(tái)不能很好的實(shí)時(shí)計(jì)算贱纠,而有些精準(zhǔn)營(yíng)銷的規(guī)則要求比較實(shí)時(shí)峻厚,即客戶最近的事件能及時(shí)參與到規(guī)則運(yùn)算。當(dāng)前事件(T+0天)要求在分鐘級(jí)內(nèi)計(jì)算與存儲(chǔ)谆焊,以供實(shí)時(shí)訪問惠桃。

(二)轉(zhuǎn)化為初步需求(User Story)

1、根據(jù)客戶ID辖试,查找客戶的所有標(biāo)簽辜王。實(shí)現(xiàn)在標(biāo)簽系統(tǒng),涉及Redis罐孝、MySQL呐馆。

2、根據(jù)客戶ID莲兢、標(biāo)簽名汹来,確認(rèn)是否有某個(gè)標(biāo)簽或得到其標(biāo)簽值。實(shí)現(xiàn)在標(biāo)簽系統(tǒng)改艇,涉及Redis收班、MySQL。

3遣耍、找到某個(gè)白名單的所有客戶,并且可支持導(dǎo)出白名單炮车。實(shí)現(xiàn)在BOSS(Back Office Support System)系統(tǒng)舵变,涉及MySQL酣溃。

4、根據(jù)標(biāo)簽名纪隙、標(biāo)簽值赊豌,找到所有符合的客戶。?實(shí)現(xiàn)在BOSS系統(tǒng)绵咱,涉及MySQL碘饼。

5、找出某個(gè)標(biāo)簽的所有枚舉值悲伶。實(shí)現(xiàn)在BOSS系統(tǒng)艾恼,涉及MySQL。

6麸锉、歷史數(shù)據(jù)清理钠绍,應(yīng)該有物理刪除及邏輯刪除。標(biāo)簽肯定需要?jiǎng)h除標(biāo)志花沉。實(shí)現(xiàn)在BOSS系統(tǒng)柳爽,涉及MySQL,Redis同步碱屁×赘客戶的過期無效標(biāo)簽可以物理刪除。停用白名單時(shí)可使用標(biāo)簽名的validity娩脾,customer_tag表不變赵誓,但相應(yīng)的查詢語句得考慮。移除白名單晦雨,物理刪除關(guān)聯(lián)標(biāo)簽名的客戶標(biāo)簽架曹。

7、設(shè)置白名單失效闹瞧。實(shí)現(xiàn)在BOSS系統(tǒng)绑雄,涉及MySQL,Redis同步奥邮。

8万牺、導(dǎo)出符合一定規(guī)則的客戶名單。實(shí)現(xiàn)在BOSS系統(tǒng)洽腺,涉及MySQL脚粟,HBase;實(shí)際上是集合運(yùn)算蘸朋。

9核无、結(jié)合客戶各種數(shù)據(jù)計(jì)算客戶標(biāo)簽。實(shí)現(xiàn)在大數(shù)據(jù)平臺(tái)藕坯,HBase+MapReduce团南。

10噪沙、由Kafka某個(gè)事件觸發(fā)的客戶標(biāo)簽計(jì)算及更新。 實(shí)現(xiàn)在標(biāo)簽系統(tǒng)吐根,涉及MySQL正歼,Redis。


三拷橘、基于MySQL數(shù)據(jù)庫(kù)的設(shè)計(jì)

1局义、標(biāo)簽表 tag_key


create ?table ?tag_key (

tag_key_id ?? ??? int unsigned not null, //?tag_key_id設(shè)計(jì)成short int,2個(gè)字節(jié)冗疮。

tag_key ? ? ? ? ? ? varchar(35) not null,

data_type ?TINYINT ?NOT NULL萄唇,?? ?//布爾型,字符串赌厅,數(shù)字區(qū)間穷绵;數(shù)字區(qū)間通過[ ? , ? )表示;

category ?TINYINT NOT NULL特愿,?? ?//管理大類仲墨,//白名單,關(guān)于管理大類還需要另外設(shè)計(jì)一張小表揍障。

validity? ? ?? ??? TINYINT NOT NULL,?? ?//0表示無效目养,1表示有效;

description ?? ?varchar(50)?,?? ?//描述

display_name?? ?varchar(50)毒嫡,//顯示在界面上的名字

created_date TIMESTAMP NOT NULL ,

creator VARCHAR(30),

updated_date TIMESTAMP?NOT NULL,

updator VARCHAR(30),

primary_key(tag_name_id)

)


????估算此表的最大行數(shù)為120行-500行癌蚁,更新頻度較低《祷可以直接緩存于應(yīng)用系統(tǒng)努释。將白名單也設(shè)計(jì)成一類特殊的標(biāo)簽,可能只有一個(gè)特殊的標(biāo)簽值:“是”咬摇,這可以統(tǒng)一模型伐蒂,簡(jiǎn)化設(shè)計(jì)。data_type數(shù)據(jù)類型的說明肛鹏,有助于Java應(yīng)用系統(tǒng)構(gòu)建對(duì)象并且檢查正確性逸邦,但實(shí)際在tag_value表都是以字符串形式存儲(chǔ),有利于擴(kuò)展在扰。相當(dāng)于將數(shù)據(jù)的完整性約束從數(shù)據(jù)庫(kù)轉(zhuǎn)移到Java實(shí)現(xiàn)缕减。

2、標(biāo)簽枚舉值表


create ?table ?tag_value (

tag_value_id ?int ?unsigned not null,

tag_value varchar(100) not null,

tag_key_id ?int unsigned not null,

primary_key(tag_value_id)

)


????估算最大行數(shù):200key x 每個(gè)key對(duì)應(yīng)25個(gè)value = 5000行芒珠。增加tag_key_id索引桥狡。

3、客戶標(biāo)簽表


create table customer_tag(

customer_id int ?not null ,

tag_key_id int not null ,

tag_value_id int not null ,

tag_time TIMESTAMP NOT NULL,

created_date TIMESTAMP NOT NULL ,

creator VARCHAR(30),

updated_date TIMESTAMP?NOT NULL,

updator VARCHAR(30),//不同的處理程序必須使用不同的身份update記錄,通過不同的creator或者updator表示批處理作業(yè)程序裹芝、流處理作業(yè)程序呈宇、運(yùn)營(yíng)人員;?



????估算最大行數(shù):客戶數(shù)*(標(biāo)簽數(shù)/客戶)=1000萬*100=10億;?

4局雄、客戶的屬性信息

客戶的屬性是比較確定的,確定的屬性有確定的值類型存炮,不同的屬性有不同的值類型炬搭,屬性不會(huì)經(jīng)常增加或減少,屬性可以通過系統(tǒng)間同步獲得穆桂,也可以能過暴露出來的服務(wù)獲得宫盔,但通常不能由運(yùn)營(yíng)人員直接導(dǎo)入。標(biāo)簽系統(tǒng)不是會(huì)員系統(tǒng)享完。必要時(shí)可以進(jìn)行表關(guān)聯(lián)操作灼芭。

5、找出某個(gè)標(biāo)簽的所有枚舉值

select tag_value.tag_value_id tag_value_id, tag_value.value tag_value_string ?

from tag_value

INNER JOIN tag_key on tag_value.tag_key_id = tag_key.tag_key_id

WHERE tag_name.name=%name

四般又、基于Redis的緩存設(shè)計(jì)

(實(shí)際值得緩存的表只有兩張)

1彼绷、緩存客戶標(biāo)簽表

1.1 數(shù)據(jù)結(jié)構(gòu):使用Redis的散列

1.2 示例:conn.hmset(customer_id,{k1:v1,k2:v2})

customer_id k1 v1 k2 v2,全部是整數(shù)

1.3 解釋:其實(shí)在進(jìn)行規(guī)則匹配時(shí)茴迁,用不著標(biāo)簽的字符串寄悯。但可能用得著客戶屬性表的字符串或金額。所以Redis散列結(jié)構(gòu)中不需要存放過多的字符串及其它的附屬信息堕义,可以直接使用猜旬,與數(shù)據(jù)庫(kù)表結(jié)構(gòu)保持一致,也可以在必要時(shí)更具效率倦卖。

1.4 占用空間評(píng)估:customer_id 4字節(jié)洒擦,tag_name_id 2字節(jié),tag_value_id 4字節(jié)怕膛,一條MySQL記錄大概10B熟嫩,

假設(shè)全量緩存:1000萬*100 *10字節(jié) = ?K 萬 *KB =萬 MB = 10GB ,加上額外的存儲(chǔ)空間,即20GB以內(nèi)嘉竟。需要3個(gè)節(jié)點(diǎn)集群*8GB/節(jié)點(diǎn)邦危。

假設(shè)只用Redis服務(wù)器簡(jiǎn)單的主從部署結(jié)構(gòu),單個(gè)Redis節(jié)點(diǎn)最多可緩存一半的客戶標(biāo)簽數(shù)據(jù)舍扰。足以應(yīng)對(duì)活躍客戶的查詢請(qǐng)求倦蚪。

1.5 如何保持同步更新:

????確保MySQL數(shù)據(jù)庫(kù)只有一個(gè)應(yīng)用入口,即插入與更新操作边苹,只有同一個(gè)Application可以操作陵且。在這個(gè)Application進(jìn)行刪改操作時(shí)檢查Redis同步刪改。而在insert時(shí)不需理會(huì)Redis,在查時(shí)沒有命中Redis緩存則從MySQL緩存至Redis慕购,設(shè)置Reids緩存有效期為一個(gè)月(視Redis大小而定)聊疲。

2、緩存tag_name表

????表的數(shù)據(jù)量很少沪悲,可以直接緩存在應(yīng)用系統(tǒng)內(nèi)存(評(píng)估最多為50KB)获洲,不需要緩存在Redis;?Java應(yīng)用多個(gè)實(shí)例無法共享這個(gè)緩存殿如,需要有一個(gè)監(jiān)聽變化的機(jī)制贡珊。可以通過注冊(cè)中心或配置中心實(shí)現(xiàn)涉馁。

3门岔、緩存tag_value表

????采用Redis數(shù)據(jù)結(jié)構(gòu):string,以tag.<tag_value_id> 為key 烤送,以標(biāo)簽值對(duì)象序列化后的json字符串或字節(jié)數(shù)組為值寒随。這種方式可以輕松獲得一個(gè)完整的標(biāo)簽值對(duì)象。雖然在規(guī)則匹配時(shí)用不著帮坚,但在配置管理等后臺(tái)界面中特別適用妻往。

????如何更新緩存:保持一個(gè)Application入口,改刪同步试和,啟動(dòng)時(shí)全量緩存蒲讯,定期輪詢糾錯(cuò)。

4灰署、白名單是否適合存放于Redis判帮?

????不適合,假設(shè)一個(gè)白名單有10萬客戶溉箕,一個(gè)白名單一個(gè)key晦墙,那對(duì)應(yīng)的集合有10萬*1KB,即100MB肴茄。這個(gè)對(duì)象太大了晌畅,傳輸時(shí)網(wǎng)絡(luò)IO容易成為性能瓶頸,而且使用頻次很低寡痰。

5抗楔、如何保持java緩存、Redis數(shù)據(jù)拦坠、MySQL數(shù)據(jù)的及時(shí)更新一致呢连躏?

????先訪問緩存,如果不命中贞滨,則訪問數(shù)據(jù)庫(kù)入热,再更新緩存。先更新數(shù)據(jù)庫(kù),再移除緩存勺良。

五绰播、基于Hbase數(shù)據(jù)庫(kù)的設(shè)計(jì)

1、表設(shè)計(jì)customer_tag

【三個(gè)列族】tag,p,ext尚困;

tag:表示客戶的標(biāo)簽蠢箩;

p:客戶的基本屬性;客戶的基本屬性包括:姓名事甜、性別忙芒、手機(jī)號(hào)、郵箱讳侨、年齡、信用評(píng)分?等奏属。

ext:客戶的擴(kuò)展信息跨跨;?客戶的擴(kuò)展信息包括:總資產(chǎn)、登陸次數(shù)等囱皿;?

行鍵:customer_id

對(duì)于tag列族勇婴,有列限定符:tag_key_id,對(duì)應(yīng)的列值則為:tag_value_id嘱腥。

六耕渴、基于標(biāo)簽的匹配規(guī)則

規(guī)則組: 表達(dá)式1 AND 表達(dá)式2 ?OR ?表達(dá)式3 AND 表達(dá)式4

默認(rèn)AND的運(yùn)算優(yōu)先級(jí)更高,相當(dāng)于 (表達(dá)式1 AND 表達(dá)式2 ) OR ( 表達(dá)式3 AND 表達(dá)式4)

NOT ?

表達(dá)式1:%tag_name = %tag_value ?齿兔,例如:age = 20-30?

表達(dá)式2:線下渠道客戶 !=某某公司

表達(dá)式3:新手客戶 = 是橱脸; 表達(dá)式4:資產(chǎn)級(jí)別 = 白領(lǐng)級(jí)別。

支持EQ 或 NE分苇,等值比較運(yùn)算符添诉;AND、 OR 医寿,邏輯運(yùn)算符栏赴。用負(fù)數(shù)表示,-1靖秩,-2须眷,-3,-4沟突。

????一個(gè)規(guī)則在UI上顯示為(表達(dá)式1 AND 表達(dá)式2 ) OR ( 表達(dá)式3 AND 表達(dá)式4)形式花颗,存儲(chǔ)于數(shù)據(jù)庫(kù)及應(yīng)用系統(tǒng)執(zhí)行規(guī)則時(shí),則是語法樹形式惠拭,某個(gè)規(guī)則可能是:-4 -3 ?-1 873 945 -2 303 934 -3 -1 833 974 -1 893 865 ?捎稚。即:運(yùn)算符在前,兩個(gè)值在后。由于標(biāo)簽的值都是離散型可窮舉的值今野,所以只能進(jìn)行等值比較葡公,不能進(jìn)行大于或者小于這樣的范圍比較。

1条霜、設(shè)計(jì)rule表


create table rule{

rule_id ?int? ? primary key,

rule_name varchar(30), // 用于BOSS系統(tǒng)被運(yùn)營(yíng)人員識(shí)別的規(guī)則名字催什。

expression ? ? varbinary(100), ?//序列化字節(jié)數(shù)組表達(dá)的規(guī)則模板。

valid_from ?datetime, //規(guī)則的有效起始日期

valid_to datetime, //規(guī)則的失效結(jié)束日期

created_date TIMESTAMP NOT NULL ,

creator VARCHAR(30),

updated_date TIMESTAMP?NOT NULL,

updator VARCHAR(30),

}


????提供給營(yíng)銷人員自由配置的規(guī)則是基于UI簡(jiǎn)單拖拽而成的宰睡,不能支持非常復(fù)雜的規(guī)則蒲凶。對(duì)于特別復(fù)雜的規(guī)則通過內(nèi)置SPI實(shí)現(xiàn),不僅僅可以利用標(biāo)簽庫(kù)內(nèi)的標(biāo)簽 拆内,還可以利用會(huì)員系統(tǒng)的客戶表信息旋圆,甚至其它更復(fù)雜的數(shù)據(jù)計(jì)算、配置管理麸恍。

七灵巧、Java設(shè)計(jì):

????在應(yīng)用系統(tǒng)中通過設(shè)計(jì)一個(gè)解釋器(設(shè)計(jì)模式)專門用于匹配規(guī)則。這些規(guī)則可以構(gòu)成一個(gè)解釋器鏈抹沪。從數(shù)據(jù)庫(kù)中一次SQL取出某個(gè)客戶的所有標(biāo)簽及其值刻肄,然后ORM為一組標(biāo)簽對(duì)象,放到解釋器鏈中進(jìn)行匹配融欧。

class Expression( Operator, ?Expression1,Expression2)

Enum Operator{EQ,NE,LE,GE,LT,GT,AND,OR,NOT} ?//運(yùn)算符的枚舉值

class TagOperator(Operator,tagNameId,tagValueId) extends Expression

????客戶屬性的表敏弃,例如年齡、資產(chǎn)噪馏、登陸次數(shù)麦到。客戶屬性不等于客戶標(biāo)簽欠肾∮缫客戶標(biāo)簽有可能是客戶屬性《茫客戶的屬性可以參與規(guī)則運(yùn)算嗎步清?可以通過API接口與SPI算法實(shí)現(xiàn)。當(dāng)涉及客戶屬性時(shí)虏肾,不能簡(jiǎn)單的通過BOSS UI配置規(guī)則廓啊,而是需要開發(fā)人員開發(fā)相應(yīng)的SPI實(shí)現(xiàn)規(guī)則。BOSS UI可以指定某些營(yíng)銷場(chǎng)景使用特定的SPI規(guī)則而不僅僅是標(biāo)簽規(guī)則封豪。

????如何進(jìn)行API與SPI的設(shè)計(jì)呢谴轮?

? ? 整個(gè)標(biāo)簽(客戶畫像、產(chǎn)品畫像)的應(yīng)用過程(規(guī)則運(yùn)算)吹埠,會(huì)涉及到3個(gè)實(shí)體:客戶第步、產(chǎn)品疮装、營(yíng)銷活動(dòng)。上面的表達(dá)式粘都、規(guī)則也都是通過BOSS UI設(shè)置綁定到這3個(gè)實(shí)體之一的廓推,當(dāng)客戶訪問系統(tǒng)某些功能或頁面時(shí)觸發(fā)計(jì)算。舉個(gè)例子翩隧,公司推出了某個(gè)營(yíng)銷活動(dòng)樊展,主要是對(duì)某款理財(cái)產(chǎn)品補(bǔ)貼1%的收益用于拉新獲客,要求滿足下面要求的客戶才可以參與這個(gè)活動(dòng):(1)來源于某個(gè)互聯(lián)網(wǎng)平臺(tái)(假設(shè)公司K)的客戶堆生,(2)不曾購(gòu)買過同類產(chǎn)品的客戶专缠,(3)根據(jù)公司K的客戶授權(quán)信息評(píng)估月收入達(dá)到白領(lǐng)標(biāo)準(zhǔn)。這個(gè)例子只是用于方便大家理解淑仆,不討論其運(yùn)營(yíng)規(guī)則設(shè)置的合理性涝婉。客戶授權(quán)信息是不能預(yù)先存儲(chǔ)與分析打標(biāo)簽的蔗怠,每個(gè)合作公司所能給出的評(píng)估信息卻又各有不同墩弯,又要求實(shí)時(shí)規(guī)則運(yùn)算,這就要求SPI的特殊定制的存在蟀淮。

? ? 場(chǎng)景分析:客戶訪問系統(tǒng)時(shí),可知客戶的基本信息钞澳。要向客戶推薦產(chǎn)品就要將所有在售產(chǎn)品過濾怠惶,找到合適的產(chǎn)品再排個(gè)優(yōu)先級(jí),將top1/2/3推薦出去轧粟。一個(gè)營(yíng)銷活動(dòng)可能涉及多款產(chǎn)品策治,而一款產(chǎn)品也可能參與到多個(gè)營(yíng)銷活動(dòng)。所以API可以簡(jiǎn)單設(shè)計(jì)成

Rule.execute(Customer cust, Prodcut ... prods);

? ? SPI(Service Provider Interface)是JDK提供的一個(gè)機(jī)制兰吟,以Jar的形式存在通惫,當(dāng)Application在classpath中找到這個(gè)Jar,能加載相應(yīng)的算法混蔼。SPI可以做得非常靈活履腋,可以復(fù)用已有的標(biāo)簽,可以運(yùn)算各種非標(biāo)簽信息惭嚣,可以做成這個(gè)標(biāo)簽系統(tǒng)的強(qiáng)大的擴(kuò)展機(jī)制遵湖。這些SPI規(guī)則雖然不同于BOSS UI的標(biāo)簽規(guī)則,卻可以在BOSS UI中同等的被營(yíng)銷人員綁定到產(chǎn)品與營(yíng)銷活動(dòng)中晚吞。

? ? 將這樣的SPI規(guī)則設(shè)計(jì)成微服務(wù)(RPC或Restful API)是否可以呢延旧?單從技術(shù)上來說是可以的。但這樣的SPI不一定是完整的服務(wù)槽地,更重要的是性能迁沫。產(chǎn)品可能有100個(gè)芦瘾,運(yùn)算一個(gè)SPI規(guī)則可能只需要3ms,而一次最簡(jiǎn)單的RPC網(wǎng)絡(luò)IO耗時(shí)至少10ms集畅,SPI本地Jar服務(wù)一個(gè)客戶只需300ms近弟,而設(shè)計(jì)成RPC則需1.5秒。這還沒有計(jì)算可能的數(shù)據(jù)傳輸與數(shù)據(jù)訪問的開銷牡整,實(shí)際差異應(yīng)該更明顯藐吮。

八、小結(jié)

? ? 這個(gè)設(shè)計(jì)方案相對(duì)于舊系統(tǒng)而言逃贝,最關(guān)鍵的在于對(duì)標(biāo)簽的重新理解谣辞,將標(biāo)簽的概念區(qū)別于客戶的屬性。將標(biāo)簽的值理解為可窮舉的離散值沐扳,這樣就可以用一個(gè)整數(shù)ID指代一個(gè)標(biāo)簽泥从,參與到整個(gè)系統(tǒng)的存儲(chǔ)與運(yùn)算過程。字符串的存儲(chǔ)及運(yùn)算消耗的資源要比整數(shù)的存儲(chǔ)及運(yùn)算消耗的資源要多很多沪摄。將tag_key與tag_value設(shè)計(jì)成維度表的方式躯嫉,所有涉及字符串的存儲(chǔ)及運(yùn)算在這里作為訪問入口一次完成,使得客戶標(biāo)簽這樣的大表避開了占據(jù)大量存儲(chǔ)資源及運(yùn)算資源的字符串處理杨拐。為什么上面多次強(qiáng)調(diào)是可窮舉的離散值呢祈餐?例如某客戶的具體月收入,可能是2135.50元哄陶,可能是35605元帆阳,可能是58000元,它是連續(xù)的有兩位小數(shù)的精確到金額“分”的值屋吨,如果存進(jìn)tag_value表每個(gè)分值一行蜒谤,就意味著可能需要數(shù)千萬行,這是不現(xiàn)實(shí)的至扰。另一方面鳍徽,營(yíng)銷的規(guī)則確實(shí)需要考慮月收入,它是一個(gè)很重要的維度敢课,這就要求系統(tǒng)設(shè)計(jì)要給出替代的方案阶祭,通過大數(shù)據(jù)分析的聚類算法或分類算法將連續(xù)的值轉(zhuǎn)變?yōu)殡x散的值,例如月收入直秆,可以經(jīng)聚類分析確認(rèn)(假設(shè))3000元-30000元是“白領(lǐng)”胖翰,3萬元-10萬元是“金領(lǐng)”,那月收入就可以用標(biāo)簽“白領(lǐng)”切厘、“金領(lǐng)”替代萨咳,而不用出現(xiàn)具體的金額。而這又會(huì)引入另外的2個(gè)問題疫稿。一是如何實(shí)時(shí)計(jì)算更新標(biāo)簽培他,這是設(shè)計(jì)中有Spark流計(jì)算的原因鹃两。二是可能有些規(guī)則還是需要一些更復(fù)雜的可能會(huì)涉及原始屬性的計(jì)算,要說服運(yùn)營(yíng)人員放棄這些規(guī)則是不可能的舀凛,要設(shè)計(jì)出一個(gè)傻瓜式的用于設(shè)置這樣規(guī)則的BOSS UI 也是非常困難的俊扳,這就需要引入SPI的設(shè)計(jì)。

? ? 關(guān)鍵的關(guān)鍵猛遍,理解業(yè)務(wù)馋记,分析需求,拋開業(yè)務(wù)分析談所謂的架構(gòu)設(shè)計(jì)都是耍流氓懊烤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梯醒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腌紧,更是在濱河造成了極大的恐慌茸习,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壁肋,死亡現(xiàn)場(chǎng)離奇詭異号胚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浸遗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門猫胁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人跛锌,你說我怎么就攤上這事弃秆。” “怎么了察净?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵驾茴,是天一觀的道長(zhǎng)盼樟。 經(jīng)常有香客問我氢卡,道長(zhǎng),這世上最難降的妖魔是什么晨缴? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任译秦,我火速辦了婚禮,結(jié)果婚禮上击碗,老公的妹妹穿的比我還像新娘筑悴。我一直安慰自己,他們只是感情好稍途,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布阁吝。 她就那樣靜靜地躺著,像睡著了一般械拍。 火紅的嫁衣襯著肌膚如雪突勇。 梳的紋絲不亂的頭發(fā)上装盯,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音甲馋,去河邊找鬼埂奈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛定躏,可吹牛的內(nèi)容都是我干的账磺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼痊远,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼垮抗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拗引,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤借宵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后矾削,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壤玫,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年哼凯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了欲间。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡断部,死狀恐怖猎贴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝴光,我是刑警寧澤她渴,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站蔑祟,受9級(jí)特大地震影響趁耗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苛败,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望径簿。 院中可真熱鬧罢屈,春花似錦、人聲如沸篇亭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽译蒂。三九已至曼月,卻和暖如春肃叶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背十嘿。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工因惭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绩衷。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓蹦魔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親咳燕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勿决,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359