前情提要
時(shí)節(jié)如流裁良,兩年前的今天寫了有贊訂單管理的三生三世與十面埋伏凿将,轉(zhuǎn)眼兩年過去了,這套架構(gòu)發(fā)展的如何价脾,遇到了什么新的挑戰(zhàn)和收獲牧抵,今天主要來一起整理回顧下有贊訂單搜索AKF架構(gòu)演進(jìn)之路。
分久必合
之前將散落在db多個(gè)分片中的數(shù)據(jù)在ES做了一次聚合侨把,帶來了巨大的好處犀变,同步任務(wù)少,維護(hù)成本低秋柄。尤其是訂單遷移這一塊获枝,之前由于是分片設(shè)計(jì),所以當(dāng)訂單觸發(fā)遷移時(shí)候华匾,需要將數(shù)據(jù)插入新分片,確認(rèn)無誤后還需要?jiǎng)h除老分片數(shù)據(jù)机隙,流程繁瑣易錯(cuò)蜘拉,統(tǒng)一收攏后對于ES來說,各個(gè)端訂單遷移有鹿,都只是一次更新操作旭旭,無比簡單。補(bǔ)充介紹下訂單遷移:
- 買家訂單遷移 針對新用戶轉(zhuǎn)變?yōu)殛P(guān)注用戶葱跋,從系統(tǒng)mock的buyerId到真正分配的buyerId訂單的遷移
- 賣家訂單遷移 針對店鋪模型升級(jí)持寄,比如從微商城到零售連鎖,原門店獨(dú)立需要遷移訂單
新的挑戰(zhàn)
然而隨著業(yè)務(wù)的不斷發(fā)展娱俺,聚合后的索引也開始暴露各種問題
- 數(shù)據(jù)量增長比預(yù)期要快很多稍味,億級(jí)別的索引,慢查也開始出現(xiàn)荠卷,像一個(gè)龐然大物蠢蠢欲動(dòng)
- 為了滿足商家的一些個(gè)性搜索需求模庐,很多搜索需求都屬于極少數(shù)會(huì)查詢到的,但是都會(huì)被加到同一個(gè)主索引中油宜,使得主索引字段不斷增多掂碱。
應(yīng)對
合久必分
為了解決以上挑戰(zhàn)怜姿,踏上了可擴(kuò)展性架構(gòu)拆分之路。簡單介紹下有贊訂單搜索的幾個(gè)維度
- B端商家單店搜索(商家管理單店訂單)
- B端商家總店跨分店搜索(連鎖總店管理分店訂單)
- C端買家跨店鋪搜索(買家管理跨店所有訂單)
由于既要ToB又要ToC疼燥,而B端零售連鎖商家的引入沧卢,增加了不少復(fù)雜度,因?yàn)橛锌偟闙U來管理多個(gè)BU單元醉者,需要跨多個(gè)店鋪查詢但狭。無論怎么分片,單一維度都必然存在跨分片搜索的場景湃交。而如何區(qū)分和定義這個(gè)冷熱數(shù)據(jù)熟空?最近一天,一月搞莺,一段時(shí)間的搜索息罗,都比較范,缺乏數(shù)據(jù)支撐才沧。
念念不忘迈喉,必有回響。
熱狀態(tài)索引
于是觀察了下我們的監(jiān)控温圆,發(fā)現(xiàn)了奇妙的規(guī)律挨摸。所有搜索場景中,常見的按支付方式岁歉,物流類型得运,商品名稱等搜索占比很少,而按訂單狀態(tài)搜索占比最多锅移,約53%熔掺,也就是一半多的流量全部來自于訂單狀態(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論訂單量如何激增眠冈,處于熱狀態(tài)的訂單數(shù)不會(huì)持續(xù)暴增,因?yàn)樗杏唵味紩?huì)流轉(zhuǎn)到終態(tài),比如超時(shí)30分鐘未付款蜗顽,訂單從待支付變成已關(guān)閉狀態(tài)布卡,比如訂單發(fā)貨7天后,從已發(fā)貨狀態(tài)變成已完成雇盖。統(tǒng)計(jì)了下忿等,熱狀態(tài)訂單總量在千萬級(jí)別,且比較平穩(wěn)的進(jìn)行流轉(zhuǎn)崔挖。
也就是說我們用這個(gè)小索引贸街,就承接了整個(gè)訂單搜索一半左右的流量,無論是統(tǒng)計(jì)狸相,總店查詢薛匪,各種維度查詢,因?yàn)樗€是一個(gè)全集脓鹃,包含所有分片場景逸尖,無比興奮。目前該索引已在線上平穩(wěn)運(yùn)行近一年瘸右。
時(shí)間分片索引
那么對于那些終態(tài)訂單隨著訂單狀態(tài)流轉(zhuǎn)會(huì)變得越來越大娇跟,如何擴(kuò)展,時(shí)間分片是個(gè)不錯(cuò)的選擇太颤,有贊訂單搜索早期最早做的切分就是按下單時(shí)間分片苞俘,之前業(yè)務(wù)數(shù)據(jù)量小,每半年一個(gè)龄章,到后來發(fā)展改成了每3個(gè)月一個(gè)吃谣,到現(xiàn)在即使每一個(gè)月一個(gè)索引都顯得有些龐大,具體還是要結(jié)合搜索場景做裙,理論上終態(tài)訂單檢索的量比較小岗憋,也可以換個(gè)思維從產(chǎn)品層面有個(gè)引導(dǎo),比如默認(rèn)只展示最近半年訂單菇用,也是一種思路澜驮。
擴(kuò)展依據(jù)
AKF 擴(kuò)展立方體
在《架構(gòu)即未來》與《架構(gòu)真經(jīng)》中都反復(fù)提到這個(gè)立方體陷揪,結(jié)合我們的實(shí)際情況惋鸥,確實(shí)受益匪淺,給了我們指引的方法論悍缠。
X軸: 關(guān)注水平的數(shù)據(jù)和服務(wù)克隆卦绣,比如主備集群,數(shù)據(jù)完全一樣復(fù)制飞蚓÷烁郏克隆多個(gè)系統(tǒng)(加機(jī)器)負(fù)載均衡分配請求
- 優(yōu)點(diǎn):成本最低,實(shí)施簡單
- 缺點(diǎn):當(dāng)個(gè)產(chǎn)品過大時(shí),服務(wù)響應(yīng)變慢
- 場景:發(fā)展初期溅漾,業(yè)務(wù)復(fù)雜度低山叮,需要增加系統(tǒng)容量
Y軸: 關(guān)注應(yīng)用中職責(zé)的劃分,比如數(shù)據(jù)業(yè)務(wù)維度拆分添履。比如交易庫屁倔,商品庫,會(huì)員庫拆分暮胧。
- 優(yōu)點(diǎn):故障隔離锐借,提高響應(yīng)時(shí)間,更聚焦
- 缺點(diǎn):成本相對較高
- 場景:業(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),影響范圍可控俺亮,可以帶來更大的擴(kuò)展性
- 缺點(diǎn):成本最高
-
場景:用戶指數(shù)級(jí)快速增長
上面介紹的熱狀態(tài)其實(shí)就是朝Y軸方向擴(kuò)展驮捍,當(dāng)然AKF可擴(kuò)展立方體的精髓就在于不要一直只在一個(gè)軸方向上擴(kuò)展,要根據(jù)不同的業(yè)務(wù)場景脚曾,規(guī)模东且,做到有針對性的擴(kuò)展,理論上XYZ軸可以做到無限擴(kuò)展本讥。目前有贊訂單搜索的總體索引架構(gòu)如下珊泳,涵蓋3個(gè)軸方向。
現(xiàn)狀
收獲
上面簡單介紹了下有贊訂單搜索AKF擴(kuò)展之路拷沸,下面再簡單聊下過程中的幾個(gè)意外收獲色查,受益良多,可以給類似業(yè)務(wù)同學(xué)一個(gè)可以嘗試的參考撞芍。
可擴(kuò)展性索引字段設(shè)計(jì)
之前遷移到ES里就是看中ES的多索引檢索能力秧了,然而多變的產(chǎn)品需求通過不斷加字段的模式,也會(huì)使索引變得越來越大序无,不好維護(hù)验毡,有沒有一種可擴(kuò)展性的方式,來以不變或者以小變應(yīng)對需求的萬變呢帝嗡。答案是肯定的晶通,list<string> 字段設(shè)計(jì),比如目前開放了擴(kuò)展點(diǎn)給有贊云哟玷,商家可以自定義的建立自己的檢索字段狮辽,K和V都有商家自己把控,如何做到代碼可配置化,業(yè)務(wù)代碼無感知呢喉脖,按照我們的約定需要檢索的字段進(jìn)入list<k_v>格式椰苟,即可做到。關(guān)于細(xì)節(jié)訂單管理系列博文之可配置化訂單搜索博文中會(huì)詳細(xì)進(jìn)一步介紹树叽。
輕量級(jí)統(tǒng)計(jì)
統(tǒng)計(jì)一直是各大公司比較重要的一塊尊剔,有贊也是,幾乎有訂單的地方都會(huì)看到各種訂單數(shù)統(tǒng)計(jì)菱皆,早期統(tǒng)計(jì)場景比較簡單须误,比如統(tǒng)計(jì)待發(fā)貨,已發(fā)貨仇轻,退款訂單等都可以通過一個(gè)sql或者一個(gè)腳本任務(wù)就可以統(tǒng)計(jì)出來京痢,但是隨著有贊業(yè)務(wù)發(fā)展的越來越快,比如統(tǒng)計(jì)一個(gè)加入擔(dān)保交易+已經(jīng)完成7天內(nèi)+發(fā)生退款的訂單數(shù)篷店,普通的統(tǒng)計(jì)模式通過更改統(tǒng)計(jì)sql,再刷個(gè)離線數(shù)據(jù)也是能做到的祭椰,但是周期往往較長,而且不夠靈活疲陕,一旦有部分失敗報(bào)錯(cuò)的方淤,查問題很困難,只能再全量重新統(tǒng)計(jì)蹄殃。而這里我們采用了另一種視角携茂,用搜索來做統(tǒng)計(jì),依賴于ES搜索默認(rèn)返回的total作為統(tǒng)計(jì)值诅岩,可以無縫利用現(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ā))独郎,誠邀有大數(shù)據(jù)思維和業(yè)務(wù)敏感度的同學(xué)加入祥国,共建有贊訂單管理大業(yè)衰粹,簡歷直郵wangye@youzan.com