1. 功能描述
營銷管理:需要通過圈人相關(guān)功能,對特定的群體進(jìn)行優(yōu)惠券發(fā)送并信息推送到位,并且統(tǒng)計(jì)后期觸發(fā)率。
1.1 活動列表

活動推送
1.2 新增活動

新增活動
1.3 活動詳情

活動詳情
2.設(shè)計(jì)方案
技術(shù)選型有多線程和MQ倆種機(jī)制來實(shí)現(xiàn),MQ業(yè)務(wù)解耦的情況更符合我們的實(shí)際需求,所以選在rabbitmq來實(shí)現(xiàn)具體的生產(chǎn)消費(fèi)。
2.1 架構(gòu)圖

總體設(shè)計(jì)流程圖

MQ選型設(shè)計(jì)圖
2.2 設(shè)計(jì)介紹
- 活動執(zhí)行順序
活動的提交是串行執(zhí)行,所以多個活動本身已處于一個FIFO隊(duì)列。對于已經(jīng)提交執(zhí)行的活動,我們通過定時任務(wù)掃描待執(zhí)行活動來進(jìn)行觸發(fā),對于排隊(duì)中的活動信息,都存入redis庫,減少定時任務(wù)掃描mysql造成的壓力。- 標(biāo)簽覆蓋
通過標(biāo)簽所覆蓋的人群基礎(chǔ)進(jìn)行篩選,針對自動推送渠道,提前預(yù)處理每個人最優(yōu)推送渠道,保證高質(zhì)量的信息觸達(dá)。- 隊(duì)列拆分
如果針對單人的優(yōu)惠券發(fā)放和信息通知同時處理,那么其效率將降低。所以我們將單個人的推送情況拆分為發(fā)券隊(duì)列和消息推送隊(duì)列,倆個隊(duì)列(并行或串行)根據(jù)業(yè)務(wù)需要,都能極大的提高推送效率。- work queue
消費(fèi)者要提高消費(fèi)能力,就需要使用到消費(fèi)者的多線程配置和批量消費(fèi)能力。rabbitmq現(xiàn)有功能,無需額外開發(fā)工作。- 推送記錄
推送記錄屬于不可更改數(shù)據(jù),存儲的選型方式很多:mongodb等。但是我們也可以使用mysql月報(bào)表模式來進(jìn)行存儲,這樣的分表模式也會提高查詢效率。- 活動結(jié)束標(biāo)示
在拆分任務(wù)進(jìn)發(fā)券隊(duì)列和消息推送隊(duì)列兩個隊(duì)列之后,均會向當(dāng)前倆隊(duì)列插入一個(n個)(防丟失情況)的最低權(quán)重的結(jié)束標(biāo)示的信息,正常情況下,消費(fèi)者在收到當(dāng)前標(biāo)示信息時會主動判定當(dāng)前隊(duì)列任務(wù)已執(zhí)行完畢并可以通知修改當(dāng)前活動結(jié)果狀態(tài)。但是消費(fèi)端屬于多線程執(zhí)行,會出現(xiàn)當(dāng)前消息被提前消費(fèi),而并存幾個處于處理中的消息,所以此處會主動查詢rabbitmq是否存在剩余unacked信息,如果存在(除去自身),則將當(dāng)前的結(jié)束標(biāo)示信息重歸隊(duì)列,等待后續(xù)消費(fèi),一直確保其他消息被消費(fèi)完畢。- 活動終止
前端提交活動終止時,我們主要通過控制消費(fèi)隊(duì)列來進(jìn)行中斷,通過清除rabbitmq中發(fā)券隊(duì)列和消息推送隊(duì)列倆個隊(duì)列中尚未被消費(fèi)的信息,原有正在處理的信息不受影響。同時,變更當(dāng)前終止活動的狀態(tài)。
3. 總結(jié)
總體思考下,當(dāng)前模塊功能的核心設(shè)計(jì)理念是:解耦和預(yù)處理。
解耦:充分利用好中間件,系統(tǒng)層面可以減少系統(tǒng)與系統(tǒng)簡單同步操作,業(yè)務(wù)層面可以讓多個業(yè)務(wù)邏輯同時進(jìn)行。
預(yù)處理:硬件配置和節(jié)點(diǎn)固定的情況下,充分做好數(shù)據(jù)的預(yù)處理,可以極大加快消費(fèi)端的能力。處理事情的效率很大程度上是消費(fèi)端沒有優(yōu)化好。