一、前情提要
時(shí)節(jié)如流砚亭,兩年前的今天寫了有贊訂單管理的三生三世與十面埋伏,轉(zhuǎn)眼兩年過(guò)去了殴玛,這套架構(gòu)發(fā)展的如何捅膘,遇到了什么新的挑戰(zhàn)和收獲,今天主要來(lái)一起整理回顧下有贊訂單搜索AKF架構(gòu)演進(jìn)之路滚粟。
1.1 分久必合
之前將散落在 DB 多個(gè)分片中的數(shù)據(jù)在 ES 做了一次聚合寻仗,帶來(lái)了巨大的好處,同步任務(wù)少凡壤,維護(hù)成本低署尤。尤其是訂單遷移這一塊耙替,之前由于是分片設(shè)計(jì),所以當(dāng)訂單觸發(fā)遷移時(shí)候曹体,需要將數(shù)據(jù)插入新分片俗扇,確認(rèn)無(wú)誤后還需要?jiǎng)h除老分片數(shù)據(jù),流程繁瑣易錯(cuò)箕别,統(tǒng)一收攏后對(duì)于 ES 來(lái)說(shuō)铜幽,各個(gè)端訂單遷移,都只是一次更新操作串稀,無(wú)比簡(jiǎn)單除抛。補(bǔ)充介紹下訂單遷移:
- 買家訂單遷移 針對(duì)新用戶轉(zhuǎn)變?yōu)殛P(guān)注用戶,從系統(tǒng) mock 的 buyerId 到真正分配的 buyerId 訂單的遷移厨诸。
- 賣家訂單遷移 針對(duì)店鋪模型升級(jí)镶殷,比如從微商城到零售連鎖,原門店獨(dú)立需要遷移訂單微酬。
二绘趋、新的挑戰(zhàn)
然而隨著業(yè)務(wù)的不斷發(fā)展,聚合后的索引也開始暴露各種問(wèn)題颗管。
- 數(shù)據(jù)量增長(zhǎng)比預(yù)期要快很多陷遮,億級(jí)別的索引,慢查也開始出現(xiàn)垦江,像一個(gè)龐然大物蠢蠢欲動(dòng)帽馋。
- 為了滿足商家的一些個(gè)性搜索需求,很多搜索需求都屬于極少數(shù)會(huì)查詢到的比吭,但是都會(huì)被加到同一個(gè)主索引中绽族,使得主索引字段不斷增多。
三衩藤、應(yīng)對(duì)
3.1 合久必分
為了解決以上挑戰(zhàn)吧慢,踏上了可擴(kuò)展性架構(gòu)拆分之路。簡(jiǎn)單介紹下有贊訂單搜索的幾個(gè)維度:
- B 端商家單店搜索(商家管理單店訂單)
- B 端商家總店跨分店搜索(連鎖總店管理分店訂單)
- C 端買家跨店鋪搜索(買家管理跨店所有訂單)
由于既要 ToB 又要 ToC 赏表,而 B 端零售連鎖商家的引入检诗,增加了不少?gòu)?fù)雜度,因?yàn)橛锌偟?MU 來(lái)管理多個(gè) BU 單元瓢剿,需要跨多個(gè)店鋪查詢逢慌。無(wú)論怎么分片,單一維度都必然存在跨分片搜索的場(chǎng)景间狂。計(jì)劃優(yōu)先按數(shù)據(jù)冷熱分離來(lái)拆分攻泼,而如何區(qū)分和定義這個(gè)冷熱數(shù)據(jù)?最近一天,一月坠韩,一段時(shí)間的搜索距潘,都比較范炼列,缺乏數(shù)據(jù)支撐只搁。
念念不忘,必有回響俭尖。
3.1.1 熱狀態(tài)索引
于是觀察了下我們的監(jiān)控氢惋,發(fā)現(xiàn)了奇妙的規(guī)律。所有搜索場(chǎng)景中稽犁,常見的按支付方式焰望,物流類型,商品名稱已亥,訂單類型等搜索占比很少熊赖,而按訂單狀態(tài)搜索占比最多,約 53% 虑椎,也就是一半多的搜索流量全部來(lái)自于訂單狀態(tài)檢索震鹉。
而細(xì)化了下這 53% 的訂單狀態(tài)搜索中,其中 3% 左右搜索終態(tài)訂單(已完成捆姜,已關(guān)閉),其中 50% 所有流量全部都是搜熱狀態(tài)訂單(待付款传趾,待發(fā)貨,待成團(tuán)泥技,待接單浆兰,已發(fā)貨),-_- 忽略比較亂的枚舉珊豹,歷史多個(gè)版本統(tǒng)計(jì)合一簸呈。
不禁讓人興奮,為什么店茶?因?yàn)闊o(wú)論訂單量如何激增蜕便,處于熱狀態(tài)的訂單數(shù)不會(huì)持續(xù)暴增,因?yàn)樗杏唵味紩?huì)陸續(xù)流轉(zhuǎn)到終態(tài)忽妒,比如超時(shí) 30 分鐘未付款玩裙,訂單從待支付變成已關(guān)閉狀態(tài),比如訂單發(fā)貨 7 天后段直,從已發(fā)貨狀態(tài)變成已完成吃溅。統(tǒng)計(jì)了下,熱狀態(tài)訂單總量在千萬(wàn)級(jí)別鸯檬,且一直比較平穩(wěn)的進(jìn)行流轉(zhuǎn)决侈。
也就是說(shuō)我們用這個(gè)千萬(wàn)級(jí)小索引,就承接了整個(gè)訂單搜索一半左右的流量。無(wú)論是統(tǒng)計(jì)赖歌,總店查詢枉圃,各種跨分片維度查詢,都可以支持庐冯。因?yàn)樗且粋€(gè)熱狀態(tài)訂單數(shù)據(jù)全集孽亲,包含所有分片場(chǎng)景,無(wú)比興奮展父。目前該索引已在線上平穩(wěn)運(yùn)行近一年返劲。
3.1.2 時(shí)間分片索引
那么對(duì)于那些終態(tài)訂單,數(shù)據(jù)量隨著訂單狀態(tài)流轉(zhuǎn)會(huì)變得越來(lái)越大栖茉,如何擴(kuò)展篮绿,時(shí)間分片是個(gè)不錯(cuò)的選擇,有贊訂單搜索早期最早做的切分就是按下單時(shí)間分片吕漂,之前業(yè)務(wù)數(shù)據(jù)量小亲配,每半年一個(gè),到后來(lái)發(fā)展改成了每 3 個(gè)月一個(gè)惶凝,到現(xiàn)在即使每一個(gè)月一個(gè)索引都顯得有些龐大吼虎。具體還是要結(jié)合搜索場(chǎng)景,理論上終態(tài)訂單檢索的量比較小梨睁,也可以換個(gè)思維從產(chǎn)品層面有個(gè)引導(dǎo)鲸睛,比如默認(rèn)只展示最近半年訂單,也是一種思路坡贺。
3.2 擴(kuò)展依據(jù)
3.2.1 AKF 擴(kuò)展立方體
在《架構(gòu)即未來(lái)》與《架構(gòu)真經(jīng)》中都反復(fù)提到這個(gè)立方體官辈,結(jié)合我們的實(shí)際情況,確實(shí)受益匪淺遍坟,給了我們指引的方法論拳亿。
X 軸 : 關(guān)注水平的數(shù)據(jù)和服務(wù)克隆,比如主備集群愿伴,數(shù)據(jù)完全一樣復(fù)制肺魁。克隆多個(gè)系統(tǒng)(加機(jī)器)負(fù)載均衡分配請(qǐng)求隔节。
- 優(yōu)點(diǎn):成本最低鹅经,實(shí)施簡(jiǎn)單
- 缺點(diǎn):當(dāng)個(gè)產(chǎn)品過(guò)大時(shí),服務(wù)響應(yīng)變慢
- 場(chǎng)景:發(fā)展初期怎诫,業(yè)務(wù)復(fù)雜度低瘾晃,需要增加系統(tǒng)容量
Y 軸 : 關(guān)注應(yīng)用中職責(zé)的劃分,比如數(shù)據(jù)業(yè)務(wù)維度拆分幻妓。比如交易庫(kù)蹦误,商品庫(kù),會(huì)員庫(kù)拆分。
- 優(yōu)點(diǎn):故障隔離强胰,提高響應(yīng)時(shí)間舱沧,更聚焦
- 缺點(diǎn):成本相對(duì)較高
- 場(chǎng)景:業(yè)務(wù)復(fù)雜,數(shù)據(jù)量大偶洋,代碼耦合度高熟吏,團(tuán)隊(duì)規(guī)模大
Z 軸 : 關(guān)注服務(wù)和數(shù)據(jù)的優(yōu)先級(jí)劃分,數(shù)據(jù)用戶維度拆分涡真。比如常見的按用戶維度買賣家切分?jǐn)?shù)據(jù)分片分俯。
- 優(yōu)點(diǎn):降低故障風(fēng)險(xiǎn)肾筐,影響范圍可控哆料,可以帶來(lái)更大的擴(kuò)展性
- 缺點(diǎn):成本最高
-
場(chǎng)景:用戶指數(shù)級(jí)快速增長(zhǎng)
上面介紹的熱狀態(tài)訂單拆分其實(shí)就是朝 Y 軸方向擴(kuò)展,當(dāng)然 AKF 可擴(kuò)展立方體的精髓就在于不要一直只在一個(gè)軸方向上擴(kuò)展吗铐,要根據(jù)不同的業(yè)務(wù)場(chǎng)景东亦,數(shù)據(jù)規(guī)模,做到有針對(duì)性的擴(kuò)展唬渗,理論上 XYZ 軸可以做到某種程度的無(wú)限擴(kuò)展典阵。目前有贊訂單搜索的總體索引架構(gòu)如下,涵蓋 3 個(gè)軸方向镊逝。
3.3 現(xiàn)狀
四壮啊、收獲
上面簡(jiǎn)單介紹了下有贊訂單搜索 AKF 擴(kuò)展之路,下面再簡(jiǎn)單聊下過(guò)程中的幾個(gè)意外收獲撑蒜,受益良多歹啼,可以給類似業(yè)務(wù)同學(xué)一個(gè)可以嘗試的參考。
4.1 可擴(kuò)展性索引字段設(shè)計(jì)
之前遷移到 ES 里就是看中 ES 的多索引檢索能力座菠,然而多變的產(chǎn)品需求通過(guò)不斷加字段的模式狸眼,也會(huì)使索引變得越來(lái)越大,不好維護(hù)浴滴,有沒(méi)有一種可擴(kuò)展性的方式拓萌,來(lái)以不變或者以小變應(yīng)對(duì)需求的萬(wàn)變呢。答案是肯定的升略,list< String > 字段設(shè)計(jì)微王,比如目前開放了搜索擴(kuò)展點(diǎn)給有贊云,商家可以自定義的建立自己的檢索字段品嚣,K 和 V 都有商家自己把控炕倘,如何做到代碼可配置化,業(yè)務(wù)代碼無(wú)感知呢腰根,按照我們的約定需要檢索的字段進(jìn)入 list< k_v > 格式激才,即可做到。關(guān)于細(xì)節(jié)訂單管理系列博文之可配置化訂單搜索博文中會(huì)詳細(xì)進(jìn)一步介紹。
4.2 輕量級(jí)統(tǒng)計(jì)
統(tǒng)計(jì)一直是各大公司比較重要的一塊瘸恼,有贊也是劣挫,幾乎有訂單的地方都會(huì)看到各種訂單數(shù)統(tǒng)計(jì),早期統(tǒng)計(jì)場(chǎng)景比較簡(jiǎn)單东帅,比如統(tǒng)計(jì)待發(fā)貨压固,已發(fā)貨,退款訂單等都可以通過(guò)一個(gè) sql 或者一個(gè)腳本任務(wù)就可以統(tǒng)計(jì)出來(lái)靠闭,但是隨著有贊業(yè)務(wù)發(fā)展的越來(lái)越快帐我,比如統(tǒng)計(jì)一個(gè)加入擔(dān)保交易+已經(jīng)完成7天內(nèi)+發(fā)生退款的訂單數(shù),普通的統(tǒng)計(jì)模式通過(guò)更改統(tǒng)計(jì) sql ,再刷個(gè)離線數(shù)據(jù)也是能做到的愧膀,但是周期往往較長(zhǎng)拦键,而且不夠靈活,一旦有部分統(tǒng)計(jì)失敗報(bào)錯(cuò)的檩淋,排查問(wèn)題很困難芬为,只能再全量重新統(tǒng)計(jì)。而這里我們采用了另一種視角蟀悦,用搜索來(lái)做統(tǒng)計(jì)媚朦,依賴于ES搜索默認(rèn)返回的 total 作為統(tǒng)計(jì)值,可以無(wú)縫利用現(xiàn)有數(shù)據(jù)做任意維度任意組合的任意統(tǒng)計(jì)日戈,隨時(shí)提需求询张,即用即拿,非常輕量浙炼。關(guān)于細(xì)節(jié)也會(huì)在訂單管理系列博文之配置化訂單統(tǒng)計(jì)博文中會(huì)做詳細(xì)進(jìn)一步介紹份氧。
五、展望
回望有贊訂單管理 4 年的心路歷程鼓拧,收獲良多半火,配置化訂單搜索,配置化訂單統(tǒng)計(jì)季俩,配置化訂單同步系列博文也會(huì)陸續(xù)發(fā)出(配置化訂單導(dǎo)出博文已發(fā))钮糖,目前已從訂單管理順利畢業(yè),后續(xù)主要負(fù)責(zé)有贊搜索中臺(tái)業(yè)務(wù)線酌住,誠(chéng)邀有成長(zhǎng)型思維店归,大數(shù)據(jù)思維和業(yè)務(wù)敏感度的同學(xué)加入,共建有贊搜索中臺(tái)大業(yè)酪我,簡(jiǎn)歷直郵 wangye@youzan.com