自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

智能投放系統(tǒng)之場(chǎng)景分析最佳實(shí)踐

開發(fā) 開發(fā)工具
后臺(tái)服務(wù)層重點(diǎn)在于提供數(shù)據(jù),保證服務(wù)的可用性。但是在組裝過程中遇到以上痛點(diǎn),導(dǎo)致出現(xiàn)請(qǐng)求響應(yīng)時(shí)間長(zhǎng),用戶體驗(yàn)差等問題。規(guī)避此類問題的主要方法是將服務(wù)調(diào)用數(shù)據(jù)提前組合計(jì)算好進(jìn)行存儲(chǔ),即數(shù)據(jù)預(yù)計(jì)算。

 背景

新美大平臺(tái)作為業(yè)內(nèi)最大的O2O的平臺(tái),以短信/push作為運(yùn)營手段觸達(dá)用戶的量級(jí)巨大,每日數(shù)以千萬計(jì)。

美團(tuán)點(diǎn)評(píng)線上存在超過千萬的POI,覆蓋超過2000城市、2.5萬個(gè)后臺(tái)商圈。在海量數(shù)據(jù)存在的前提下,實(shí)時(shí)投放的用戶在場(chǎng)景的選擇上存在一些困難,所以我們提供對(duì)場(chǎng)景的顆?;樵兒椭悄芙ㄗh,為用戶解決三大難題:

  • 我要投放的區(qū)域在哪,實(shí)時(shí)和歷史的客流量是什么樣的?
  • 在我希望投放的區(qū)域歷史和現(xiàn)在都發(fā)生過什么活動(dòng),效果是什么樣的?
  • 這個(gè)區(qū)域是不是適合我投放,系統(tǒng)建議我投放哪里?

如圖1所示,整個(gè)產(chǎn)品致力于解決以上三大問題,能夠?yàn)檫\(yùn)營在活動(dòng)投放前期,提供有效的參考決策依據(jù)。

圖1 場(chǎng)景查詢器模塊效果圖

挑戰(zhàn)

  • 場(chǎng)景查詢器需要展示的數(shù)據(jù)分為多種,所以數(shù)據(jù)過濾和組裝的時(shí)間,嚴(yán)重依賴于基礎(chǔ)數(shù)據(jù)量。但是隨著維度的下鉆,基礎(chǔ)數(shù)據(jù)量巨大,所以導(dǎo)致實(shí)時(shí)計(jì)算數(shù)據(jù)的響應(yīng)時(shí)間無法忍受。
  • 數(shù)據(jù)來源均是RPC服務(wù),需要調(diào)用的服務(wù)多種多樣,每一項(xiàng)服務(wù)的響應(yīng)時(shí)間都會(huì)影響最終的結(jié)果返回,難以提供前端接口的響應(yīng)時(shí)間。
  • 需要組裝的數(shù)據(jù)各種各樣,沒有統(tǒng)一的數(shù)據(jù)模型,造成代碼耦合度高,后期難以維護(hù)針對(duì)上面的挑戰(zhàn),我們給出如下的解決方案。

總體方案

圖2 場(chǎng)景查詢器體系架構(gòu)

如圖2所示,我們的總體架構(gòu)是分層設(shè)計(jì)的,最底層都是各類服務(wù),再上層是預(yù)計(jì)算層和數(shù)據(jù)層,預(yù)計(jì)算層的作用很明顯,是連接服務(wù)和數(shù)據(jù)的核心層,通過拉取后臺(tái)服務(wù)的各類數(shù)據(jù)然后預(yù)計(jì)算形成數(shù)據(jù)層。再往上是中臺(tái)服務(wù)層,包含有核心功能是服務(wù)熔斷降級(jí),以及通用服務(wù),為具體業(yè)務(wù)邏輯提供統(tǒng)一的服務(wù),最上層便是具體的業(yè)務(wù)邏輯了,對(duì)應(yīng)具體場(chǎng)景和需求。

后臺(tái)服務(wù)層

該層均是Thrift的RPC服務(wù),提供各種投放的反饋數(shù)據(jù)。

數(shù)據(jù)組裝

后臺(tái)服務(wù)層數(shù)據(jù)特點(diǎn)是數(shù)據(jù)分散,結(jié)果多樣。數(shù)據(jù)組裝是對(duì)多個(gè)服務(wù)調(diào)用返回的結(jié)果,進(jìn)行過濾組合。

圖3 后臺(tái)服務(wù)結(jié)果數(shù)據(jù)組裝樣例

如圖3所示,服務(wù)1、2、3分別用黃色、藍(lán)色、棕色表示,A 、B、C均是調(diào)用對(duì)應(yīng)服務(wù)返回的數(shù)據(jù),并且A、B的數(shù)據(jù)格式是列表,C是單個(gè)數(shù)據(jù)。最后一個(gè)虛線框,代表數(shù)據(jù)組裝算法,A和B的列表取交集,結(jié)果是長(zhǎng)度為2的列表,然后再依次調(diào)用服務(wù)3,單個(gè)獲取數(shù)據(jù)C。

數(shù)據(jù)組裝痛點(diǎn)

  • 過程繁瑣,如取交集,單個(gè)組裝等等,組裝時(shí)間受數(shù)據(jù)量影響較大。
  • 組裝過程中,混合著大量的服務(wù)調(diào)用,組裝時(shí)間受服務(wù)響應(yīng)時(shí)間影響較大。

后臺(tái)服務(wù)層重點(diǎn)在于提供數(shù)據(jù),保證服務(wù)的可用性。但是在組裝過程中遇到以上痛點(diǎn),導(dǎo)致出現(xiàn)請(qǐng)求響應(yīng)時(shí)間長(zhǎng),用戶體驗(yàn)差等問題。規(guī)避此類問題的主要方法是將服務(wù)調(diào)用數(shù)據(jù)提前組合計(jì)算好進(jìn)行存儲(chǔ),即數(shù)據(jù)預(yù)計(jì)算。

預(yù)計(jì)算層

主要作用在于提前計(jì)算數(shù)據(jù),快速響應(yīng)請(qǐng)求,構(gòu)建過程依次為數(shù)據(jù)建模、構(gòu)建計(jì)算模式。該層主要包含以下核心功能。

  • 構(gòu)建通用的數(shù)據(jù)模型,使上層控制和處理,更加高效。
  • 保證計(jì)算速度的同時(shí),計(jì)算大量基礎(chǔ)數(shù)據(jù)。
  • 為了保證數(shù)據(jù)的實(shí)時(shí)性,實(shí)現(xiàn)高密度并行計(jì)算。

數(shù)據(jù)模型

圖4 預(yù)計(jì)算數(shù)據(jù)模型

在場(chǎng)景查詢器中,為前端提供的數(shù)據(jù)普遍都是上下級(jí)數(shù)據(jù),比如頁面要展示全國匯總數(shù)據(jù),同時(shí)會(huì)級(jí)聯(lián)展示下屬各省數(shù)據(jù),如果展示省級(jí)匯總數(shù)據(jù),那么同時(shí)級(jí)聯(lián)展示下屬各地級(jí)市數(shù)據(jù)。通過分析業(yè)務(wù)需求,發(fā)現(xiàn)需要的數(shù)據(jù),大多是分上下級(jí)的這種級(jí)聯(lián)數(shù)據(jù)。經(jīng)過抽象,數(shù)據(jù)模型設(shè)計(jì)為樹形結(jié)構(gòu),如圖4,左側(cè)為概念模型,樹的高度只有兩層,根節(jié)點(diǎn)為匯總數(shù)據(jù),葉子節(jié)點(diǎn)為地理等級(jí)維度下鉆的數(shù)據(jù);右側(cè)為實(shí)際使用的模型,因?yàn)榈讓泳S度的基數(shù)比較大,不利于下級(jí)數(shù)據(jù)的遍歷、篩選和分頁,所以實(shí)際使用中,下級(jí)節(jié)點(diǎn)數(shù)據(jù)以一個(gè)列表存儲(chǔ)。節(jié)點(diǎn)可以存儲(chǔ)若干指標(biāo),具體類型根據(jù)地理維度而定。該模型的特點(diǎn)如下:首先支持地理維度繼續(xù)下鉆,其次在后臺(tái)服務(wù)支持的情況下,可以對(duì)歷史數(shù)據(jù)做預(yù)計(jì)算。

數(shù)據(jù)存儲(chǔ)和獲取

有了數(shù)據(jù)模型,需要確定一個(gè)高效的數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)定位的方式,因?yàn)榻Y(jié)果數(shù)據(jù)大多是非半結(jié)構(gòu)化數(shù)據(jù),而且低維度的的數(shù)據(jù)量數(shù)據(jù)量較大,所以采用NoSQL來存儲(chǔ)數(shù)據(jù)。

圖5 數(shù)據(jù)存儲(chǔ)和提取方式示意圖

如圖5所示,ID表示地理維度值,level表示地理維度等級(jí),數(shù)據(jù)節(jié)點(diǎn)(包含根和葉子節(jié)點(diǎn))以ID+level為Key,轉(zhuǎn)化為樹形JSON格式數(shù)據(jù)存儲(chǔ),通過ID+level可以唯一獲取到一個(gè)數(shù)據(jù),在數(shù)據(jù)量不大的情況下,還可以通過級(jí)聯(lián)獲取下級(jí)模型,即圖中虛線代表級(jí)聯(lián)獲取下級(jí)數(shù)據(jù)。

計(jì)算模式

在構(gòu)建的數(shù)據(jù)模型基礎(chǔ)上,該層最核心便是預(yù)計(jì)算模式,從業(yè)務(wù)需求出發(fā),數(shù)據(jù)需要在地理等級(jí)這個(gè)維度不斷下鉆,從全國開始,一直下鉆到POI級(jí)別,每個(gè)級(jí)別單獨(dú)分層計(jì)算,然后存儲(chǔ)計(jì)算結(jié)果。

圖6 預(yù)計(jì)算模式示意圖

如圖6所示,每一個(gè)矩形代表一級(jí)維度的計(jì)算,從左到右依次進(jìn)行維度下鉆,從全國的數(shù)據(jù)依次計(jì)算到商圈,計(jì)算分層每層單獨(dú)計(jì)算。

實(shí)現(xiàn)方式

圖7 層序計(jì)算示意圖

如圖7所示,是計(jì)算模式的兩種實(shí)現(xiàn)方式,上半部分是串行層序計(jì)算,下半部分是并行層序計(jì)算。每部分從上到下分不同顏色區(qū)分不同的計(jì)算層次。每個(gè)矩形對(duì)應(yīng)一個(gè)具體ID的計(jì)算,t代表計(jì)算時(shí)間,這里假設(shè)所有計(jì)算單元的計(jì)算時(shí)間都相同,方便對(duì)比計(jì)算時(shí)間。

1)串行層序計(jì)算

如圖7,普通的串行計(jì)算,使用單線程計(jì)算,從上到下一層一層計(jì)算,這類計(jì)算的的痛點(diǎn)有兩處,第一,是時(shí)間復(fù)雜度的,每個(gè)計(jì)算單元的計(jì)算時(shí)間都會(huì)累計(jì),如計(jì)算第一層的時(shí)間為3t,第二層為4t,第三層為6*t,總計(jì)耗時(shí)13t。第二,是空間復(fù)雜度的,因?yàn)閿?shù)據(jù)均是調(diào)用后臺(tái)服務(wù)獲取,計(jì)算一層的同時(shí),需要把下級(jí)的數(shù)據(jù)都存儲(chǔ)起來,在計(jì)算下層時(shí)候,再遍歷數(shù)據(jù)計(jì)算。

2)并行層序計(jì)算

依賴于Apache Storm計(jì)算框架,將數(shù)據(jù)抽象成為流,然后通過不同的Bolt,分別計(jì)算不同維度的數(shù)據(jù)。每一級(jí)Bolt首先處理數(shù)據(jù),然后將下級(jí)數(shù)據(jù)流入下一級(jí)Bolt。同時(shí)隨著維度的下鉆,計(jì)算的數(shù)據(jù)量變得越來越大,通過增加Bolt的并發(fā)度,加速計(jì)算。在預(yù)計(jì)算的過程中,主要利用了Storm高速數(shù)據(jù)分發(fā)和高密度并行計(jì)算的特性,規(guī)避了串行計(jì)算的痛點(diǎn),首先時(shí)間復(fù)雜度大幅度降低,如圖7所示,因?yàn)榭梢圆⑿杏?jì)算,所以每一層的時(shí)間只花費(fèi)t,那么總耗時(shí)為3*t,當(dāng)然這樣估算是不準(zhǔn)確的,因?yàn)闆]必要在一層所有數(shù)據(jù)都計(jì)算完,才發(fā)射數(shù)據(jù),可以在每一個(gè)計(jì)算單元運(yùn)行完畢,就發(fā)射數(shù)據(jù)。這樣就可以形成上下級(jí)數(shù)據(jù)計(jì)算流水線,進(jìn)一步壓縮計(jì)算時(shí)間。其次,空間復(fù)雜度大幅度降低,在Storm中,不需要保存下級(jí)數(shù)據(jù),因?yàn)閿?shù)據(jù)是不斷流動(dòng)的,計(jì)算完畢就會(huì)被發(fā)射到下級(jí)Bolt。為此,本文采用Storm做預(yù)計(jì)算。計(jì)算拓?fù)浣Y(jié)構(gòu)如圖8。

圖8 Storm計(jì)算拓?fù)涫疽鈭D

如圖8所示,數(shù)據(jù)源頭(ChinaSpout)只有一個(gè),該Spout內(nèi)首先計(jì)算全國到省的數(shù)據(jù),包括全國匯總數(shù)據(jù)以及省一級(jí)的數(shù)據(jù),然后立刻將所有省級(jí)數(shù)據(jù)流入下層的ProvinceBolt,這一層應(yīng)該考慮增加并發(fā)度,因?yàn)槭〉绞幸患?jí)的數(shù)據(jù)量級(jí)開始擴(kuò)大,設(shè)置并發(fā)度為40,在計(jì)算完省到市級(jí)數(shù)據(jù)之后,數(shù)據(jù)開始流入CityBolt,這一層到市級(jí)數(shù)據(jù),并發(fā)度可以再擴(kuò)大,目前配置為300,計(jì)算完畢之后,數(shù)據(jù)流入最后一層BareaBolt,計(jì)算商圈到POI級(jí)別的數(shù)據(jù)。各級(jí)Bolt預(yù)計(jì)算產(chǎn)生的結(jié)果數(shù)據(jù),都會(huì)存入數(shù)據(jù)層。存儲(chǔ)時(shí)遇到一個(gè)問題,在計(jì)算商圈到POI級(jí)別的數(shù)據(jù)時(shí)候,發(fā)現(xiàn)POI的量級(jí)比較大,不能直接存儲(chǔ)。為了不影響數(shù)據(jù)模型的通用性,我們隊(duì)POI級(jí)別的做了壓縮,然后再做存儲(chǔ)。為了保障數(shù)據(jù)的實(shí)時(shí)性,數(shù)據(jù)源會(huì)周期性產(chǎn)生數(shù)據(jù)流,更新預(yù)計(jì)算數(shù)據(jù),其實(shí)這是Storm一類計(jì)算模式-----DRPC,數(shù)據(jù)源頭就是發(fā)射的參數(shù),Storm的各級(jí)Bolt承擔(dān)運(yùn)算。

該層解決的最大問題,是計(jì)算速度慢的問題,通過高密度的并發(fā)計(jì)算,降低重復(fù)數(shù)據(jù)過濾,大量數(shù)據(jù)組合,以及批量數(shù)據(jù)獲取慢對(duì)響應(yīng)時(shí)間的影響。

數(shù)據(jù)層

預(yù)計(jì)算之后的數(shù)據(jù)需要存儲(chǔ),供業(yè)務(wù)邏輯使用,存儲(chǔ)選型需要滿足以下幾點(diǎn):

  • 預(yù)計(jì)算產(chǎn)生的數(shù)據(jù)模型是樹形結(jié)構(gòu),所以不適合關(guān)系型數(shù)據(jù)庫
  • 數(shù)據(jù)具有時(shí)效性,數(shù)據(jù)過期會(huì)帶來臟數(shù)據(jù)
  • 高密度并行計(jì)算,寫入并發(fā)量大,需要保證寫入速度
  • 實(shí)現(xiàn)災(zāi)備,存儲(chǔ)不可用時(shí)候,需要服務(wù)降級(jí)

為了滿足以上幾點(diǎn)要求,選用美團(tuán)點(diǎn)評(píng)內(nèi)部研發(fā)的公共KV存儲(chǔ)組件Squirrel和Tair分別來做存儲(chǔ)和災(zāi)備。其中,Squirrel是基于Redis Cluster的純內(nèi)存存儲(chǔ),squirrel 屬于KV存儲(chǔ),具有寫入、查詢速度快,并發(fā)度高,支持?jǐn)?shù)據(jù)豐富,時(shí)效好的特點(diǎn)。而Tair支持持久化,性價(jià)比更高,適合用來做災(zāi)備,當(dāng)Squirrel不可用時(shí),使用Tair提供服務(wù)。

熔斷層

預(yù)計(jì)算過程中,為了實(shí)現(xiàn)災(zāi)備,還需要使用熔斷技術(shù)實(shí)現(xiàn)服務(wù)降級(jí)。熔斷雖然在上層控制,嚴(yán)格來說應(yīng)該屬于數(shù)據(jù)層。

圖9 服務(wù)熔斷、降級(jí)工作原理

熔斷技術(shù)選用公共組件Rhino(美團(tuán)點(diǎn)評(píng)自研的穩(wěn)定性保障平臺(tái),比Hystrix更加輕量、易用及可控,提供故障模擬、降級(jí)演練、服務(wù)熔斷、服務(wù)限流等功能),主要作用是:

a. 保護(hù)服務(wù),防止服務(wù)雪崩

b. 及時(shí)熔斷,保障服務(wù)穩(wěn)定

c. 提供多種降級(jí)策略,靈活適配服務(wù)場(chǎng)景

如圖9所示,虛線框,代表Rhino控制的區(qū)域,request1到來的時(shí)候,squirrel沒有問題,正常提供服務(wù)。request2 到來的時(shí)候,訪問squirrel發(fā)生異常(超時(shí)、異常等),請(qǐng)求被切換到tair。在squirrel恢復(fù)的過程中,Rhino會(huì)心跳請(qǐng)求squirrel,驗(yàn)證服務(wù)可用性。request3請(qǐng)到來squirrel此刻已經(jīng)恢復(fù)正常,由于Rhino會(huì)周期檢測(cè),所以請(qǐng)求再次被切換到squirrel上恢復(fù)正常。

中臺(tái)服務(wù)層

數(shù)據(jù)準(zhǔn)備好之后,還不能被業(yè)務(wù)邏輯直接使用,需要提供統(tǒng)一的服務(wù),應(yīng)對(duì)多變的業(yè)務(wù)邏輯。該層主要解決如下問題:

  • 數(shù)據(jù)模型修改對(duì)業(yè)務(wù)邏輯有影響,數(shù)據(jù)服務(wù)需對(duì)上層具體業(yè)務(wù)邏輯透明
  • 業(yè)務(wù)邏輯對(duì)數(shù)據(jù)有部分通用操作,需要抽象通用操作,防止數(shù)據(jù)業(yè)務(wù)緊耦合
  • 存儲(chǔ)不可用的時(shí)候,需要服務(wù)熔斷和降級(jí),降低對(duì)業(yè)務(wù)邏輯的影響
  • 服務(wù)擴(kuò)展增強(qiáng)能力,不能影響正常業(yè)務(wù)邏輯

該層對(duì)外提供RPC服務(wù),直接處理數(shù)據(jù)模型,提供數(shù)據(jù)分頁、數(shù)據(jù)壓縮、數(shù)據(jù)解壓、數(shù)據(jù)篩選、數(shù)據(jù)批量提取以及數(shù)據(jù)原子提取 等功能,基本覆蓋了大部分對(duì)數(shù)據(jù)的操作,使得業(yè)務(wù)邏輯更加簡(jiǎn)單。提取數(shù)據(jù)的時(shí)候,加入Rhino實(shí)現(xiàn)服務(wù)熔斷和降級(jí),為業(yè)務(wù)邏輯層提供穩(wěn)定可靠的服務(wù)。因?yàn)樵搶又苯硬僮髂P蛿?shù)據(jù),所以即使數(shù)據(jù)模型有改動(dòng),也不會(huì)對(duì)業(yè)務(wù)邏輯造成影響,大大降低數(shù)據(jù)和業(yè)務(wù)的耦合。另外該層支持服務(wù)橫向擴(kuò)展,在消費(fèi)者大量增加的情況下,仍然能保證服務(wù)可靠運(yùn)轉(zhuǎn)。

通過一系列的抽象和分層,最終業(yè)務(wù)邏輯直接使用簡(jiǎn)單的服務(wù)接口就可以實(shí)現(xiàn),客戶端的響應(yīng)從最開始的十幾秒,提升到1秒以內(nèi),并且數(shù)據(jù)和代碼之間的耦合大幅度降低,對(duì)于后面的業(yè)務(wù)變化,只需要修改數(shù)據(jù)模型,增量提供若干中臺(tái)服務(wù)接口,即可滿足需求,大大降低了開發(fā)難度。

作者簡(jiǎn)介

張騰,美團(tuán)點(diǎn)評(píng)系統(tǒng)開發(fā)工程師,2016年畢業(yè)于西安電子科技大學(xué),同年加入招銀網(wǎng)絡(luò)科技,從事系統(tǒng)開發(fā)以及數(shù)據(jù)開發(fā)工作。2017年加入美團(tuán)點(diǎn)評(píng)數(shù)據(jù)中心,長(zhǎng)期從事BI工具開發(fā)工作。

【本文為51CTO專欄機(jī)構(gòu)“美團(tuán)點(diǎn)評(píng)技術(shù)團(tuán)隊(duì)”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過微信公眾號(hào)聯(lián)系機(jī)構(gòu)獲取授權(quán)】

戳這里,看該作者更多好文

 

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2014-09-29 09:48:54

MySQLMySQL實(shí)踐

2017-12-14 15:01:20

智能分析實(shí)踐

2023-05-15 08:24:46

2024-08-29 09:32:36

2021-10-12 10:43:38

區(qū)塊鏈技術(shù)智能

2009-06-22 14:48:21

DRY架構(gòu)設(shè)計(jì)

2017-10-13 18:33:57

靜態(tài)代碼分析SCAIDS

2024-01-15 07:36:46

AI系統(tǒng)監(jiān)控系統(tǒng)

2013-09-03 09:37:50

2024-01-05 07:44:22

人工智能用戶隱私AI

2014-02-26 11:01:28

日志優(yōu)化系統(tǒng)日志

2024-12-24 13:30:00

2023-07-21 01:12:30

Reactfalse?變量

2011-08-18 11:05:21

jQuery

2011-07-26 09:31:39

Windows Ser

2010-09-25 10:47:40

Linux文件系統(tǒng)Tripwire

2011-02-21 10:31:24

2012-01-09 11:35:01

WebApp最佳實(shí)踐策略

2022-12-07 08:31:45

ClickHouse并行計(jì)算數(shù)據(jù)

2012-01-17 10:20:25

Web App最佳實(shí)踐用戶體驗(yàn)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)