有贊訂單管理的三生三世與“十面埋伏”

轉(zhuǎn)載:有贊訂單管理的三生三世與“十面埋伏”

有贊訂單管理主要承接有贊所有訂單搜索及詳情展示功能,系統(tǒng)隨著業(yè)務(wù)的不斷發(fā)展經(jīng)歷了多次飛升之路袋励。下面簡單介紹下有贊訂單管理系統(tǒng)的三生三世與“十面埋伏”预愤。

第一世:凡人飛升小仙之路-分庫分表

隨著業(yè)務(wù)發(fā)展寥枝,單庫單表所能承載的數(shù)據(jù)量局限性越發(fā)嚴(yán)重。

歷劫:單庫單表數(shù)據(jù)量承載局限

渡劫:分庫分表

分庫分表的維度針對系統(tǒng)買賣家查詢的需求蕾各,分片鍵為買家id和店鋪id蕊温,其余訂單擴(kuò)展信息表屬于數(shù)據(jù)組裝信息袱箱,均以店鋪id為分片鍵。

結(jié)果:分庫分表后义矛,數(shù)據(jù)業(yè)務(wù)量的承載質(zhì)的提升发笔。

第二世:小仙飛升上仙之路-引入ES搜索引擎

隨著業(yè)務(wù)搜索維度的不斷添加,使得跨表查詢需求越來越多凉翻,系統(tǒng)的慢查不斷報(bào)出了讨,為此引入了ES搜索引擎。

歷劫:跨表查詢越來越多制轰,系統(tǒng)慢查頻頻報(bào)出

渡劫:引入ES搜索引擎

ElasticSearch是一個(gè)基于Lucene的搜索服務(wù)器,這里主要是通過將訂單主表及輔表的索引字段同步到ES里前计,這些每張表單獨(dú)的索引字段,匯總成一個(gè)聯(lián)合索引垃杖,來實(shí)現(xiàn)多個(gè)表的跨表搜索男杈。

結(jié)果:目前運(yùn)行良好,統(tǒng)計(jì)的檢索需求響應(yīng)時(shí)間均值20ms以內(nèi)调俘,對于命中緩存的在1ms以內(nèi)返回伶棒。由于多表聯(lián)查的流量都進(jìn)了ES,所以系統(tǒng)慢查被清0旺垒。

兩個(gè)問題需要注意下

1.單Type與多Type的選擇

ES里使用文檔存儲(chǔ),一個(gè)Index可以理解為一個(gè)庫肤无,一個(gè)Type可以理解為一張表先蒋,那么訂單及其擴(kuò)展信息面臨使用單Type還是多Type的抉擇。

多Type優(yōu)點(diǎn): 可以做到索引字段與表結(jié)構(gòu)一一對應(yīng), 數(shù)據(jù)同步隔離單一宛渐,直觀簡單竞漾。

多Type缺點(diǎn):獲取數(shù)據(jù)時(shí)候需要一次數(shù)據(jù)聚合,比如一次跨5張表索引聯(lián)查窥翩,需要先分別取出5張表的數(shù)據(jù)业岁,然后做一次交集。性能會(huì)有影響鳍烁。類似于DB的跨表聯(lián)查叨襟,而且當(dāng)數(shù)據(jù)做冷熱隔離繁扎,數(shù)據(jù)拆分時(shí)候幔荒,多Type的拆分和維護(hù)成本反而更高。

單Type優(yōu)點(diǎn):可以做到數(shù)據(jù)一次請求即可將目標(biāo)信息全量返回梳玫,一個(gè)Type的數(shù)據(jù)拆分冷熱隔離維護(hù)成本可控爹梁。

單Type缺點(diǎn):數(shù)據(jù)同步成本高一些,要做好數(shù)據(jù)聚合一致性問題提澎。 結(jié)合業(yè)務(wù)需求場景姚垃,這里采用的單Type方案。如下圖所示盼忌。

2.索引字段數(shù)量控制

由于訂單及其擴(kuò)展信息字段較多积糯,將這些信息全量同步到ES會(huì)導(dǎo)致索引字段過多,索引文件也會(huì)隨之過大谦纱,檢索效率會(huì)受到影響看成。所以這里采用了將訂單及其擴(kuò)展信息中強(qiáng)搜索需求的索引字段同步了進(jìn)來,并沒有做全量所有字段同步跨嘉。

第三世:上仙飛升上神之路-引入Hbase

隨著業(yè)務(wù)的不斷發(fā)展川慌,對系統(tǒng)性能的要求的不斷提高,我們發(fā)現(xiàn)雖然數(shù)據(jù)檢索的效率很高祠乃,但是數(shù)據(jù)組裝的效率令人擔(dān)憂梦重,由于需要從ES中獲取的訂單號(hào)列表到各個(gè)擴(kuò)展表去獲取具體信息,也就是一次完整的訂單列表拉取時(shí)間=數(shù)據(jù)檢索時(shí)間+數(shù)據(jù)組裝時(shí)間亮瓷,而數(shù)據(jù)組裝就算是批量獲取琴拧,也要去取N(假如有N張訂單擴(kuò)展表)次,即使并行去取也不夠高效嘱支,上文討論過沒有將訂單的所有信息全部同步到ES的原因艾蓝,這樣一次完整的訂單拉取時(shí)間=數(shù)據(jù)檢索時(shí)間力崇。

歷劫:數(shù)據(jù)組裝效率低下

渡劫:引入Hbase來為詳情數(shù)據(jù)組裝 Hbase是一個(gè)高可靠性、高性能赢织、面向列亮靴、可伸縮的分布式存儲(chǔ)系統(tǒng)∮谥茫可以通過MapReduce來處理HBase中的海量數(shù)據(jù)茧吊。

這里將訂單基本信息及其強(qiáng)依賴的擴(kuò)展信息全量導(dǎo)入Hbase,其中歷史數(shù)據(jù)采用BulkLoad導(dǎo)入八毯,增量數(shù)據(jù)采用消息同步寫入搓侄,以訂單號(hào)為rowKey為訂單號(hào),這樣通過一次請求话速,將該訂單的基本信息及擴(kuò)展信息一次性取出讶踪。

結(jié)果:訂單管理架構(gòu)被抽象成了DB+ES+HBASE的三層架構(gòu)(如下圖所示),DB作為數(shù)據(jù)寫入源頭泊交,ES負(fù)責(zé)搜索請求的parser解析及基本數(shù)據(jù)返回(即Es返回字段即可滿足需求的場景)乳讥,而Hbase作為訂單詳情詳細(xì)信息的組裝載體,兩者配合提升整個(gè)訂單列表搜索和詳情組裝的性能廓俭。同時(shí)Hbase的數(shù)據(jù)源也可以被復(fù)用到訂單導(dǎo)出云石,數(shù)據(jù)統(tǒng)計(jì)等離線需求上。

寫到這里可能很多朋友都看出研乒,實(shí)現(xiàn)這一切還有一個(gè)非常重要的劫需要去渡汹忠。那就是數(shù)據(jù)同步的實(shí)時(shí)性和一致性。感興趣的話后續(xù)文章可以重點(diǎn)寫寫數(shù)據(jù)同步以及踩過的坑和破局之道雹熬,這里簡單拋磚引玉下宽菜。

歷劫:數(shù)據(jù)同步的實(shí)時(shí)性與一致性

渡劫:鏈路白盒+冪等性保障

1. 鏈路白盒:整個(gè)同步鏈路是先監(jiān)聽binlog然后同步到消息隊(duì)列中,業(yè)務(wù)消費(fèi)處理同步到Es和Hbase竿报,可以將整個(gè)同步鏈路監(jiān)控起來铅乡,比如一個(gè)消息binlogTime->addMqTime->processTime->addEsOrHbaseTime,這個(gè)差值其實(shí)就是實(shí)時(shí)性的一個(gè)指標(biāo)。一旦整個(gè)同步鏈路的白盒搭建好仰楚,那么對應(yīng)的報(bào)警監(jiān)控隆判,失敗重試補(bǔ)償就都可以跟進(jìn)配套完成。保證數(shù)據(jù)的完整性與實(shí)時(shí)性僧界。同步鏈路及同步監(jiān)控如下圖所示侨嘀。

2.冪等性保障:如果不能保證業(yè)務(wù)消費(fèi)的冪等性,那么消息的亂序捂襟,數(shù)據(jù)的重放監(jiān)控補(bǔ)償?shù)鹊染蜁?huì)很被動(dòng)咬腕。這里簡單提供幾種冪等思路:

業(yè)務(wù)樂觀鎖字段:比如訂單狀態(tài)的流轉(zhuǎn),應(yīng)該是一個(gè)正向更新葬荷,即后一次更新的state一定大于等于前一次涨共。

version字段:表設(shè)計(jì)時(shí)候留一個(gè)version字段纽帖,每次數(shù)據(jù)庫更新都會(huì)將該字段加1,作為樂觀鎖依據(jù)举反。

sonwflake算法:可以根據(jù)業(yè)務(wù)需要定制自己的snowflake算法懊直,比如毫秒級(jí)時(shí)間戳+binlog變更自增號(hào)

消息有序:對于一些強(qiáng)依賴消息有序或者業(yè)務(wù)樂觀鎖不好設(shè)定時(shí)候,消息端的有序變得尤為重要火鼻,可以給根據(jù)業(yè)務(wù)唯一鍵(如訂單號(hào))進(jìn)行機(jī)器取模室囊,保證同一筆訂單的變更數(shù)據(jù)會(huì)被推送到同一臺(tái)機(jī)器上消費(fèi)。 其中業(yè)務(wù)樂觀鎖使用簡單高效魁索,無需額外存儲(chǔ)樂觀鎖字段融撞,而消息強(qiáng)有序每次需要使用取模計(jì)算,性能多少會(huì)有些影響粗蔚,不過經(jīng)過壓測數(shù)據(jù)顯示性能差別不大尝偎,這邊采用業(yè)務(wù)樂觀鎖+消息有序共用的方案。目前線上運(yùn)行良好鹏控。

簡單回顧了下有贊訂單管理的“飛升之路”致扯,至于是不是上神,還有待進(jìn)一步考驗(yàn)牧挣,后面會(huì)重點(diǎn)發(fā)力在配置化編程急前,系統(tǒng)白盒監(jiān)控最大化及系統(tǒng)性能的不斷提升上醒陆,歡迎有志之士加入來一起飛升wangye@youzan.com瀑构。

無論是十里桃林涼涼月色恬靜中的怡然,還是淺淺歲月十面埋伏中驚悚后的酣暢刨摩,都是一種體驗(yàn)寺晌,經(jīng)歷了就是經(jīng)驗(yàn),愿我們一起把握每一個(gè)重要而幸運(yùn)的經(jīng)歷澡刹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呻征,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子罢浇,更是在濱河造成了極大的恐慌陆赋,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚷闭,死亡現(xiàn)場離奇詭異攒岛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)胞锰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門灾锯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嗅榕,你說我怎么就攤上這事顺饮〕炒希” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵兼雄,是天一觀的道長吟逝。 經(jīng)常有香客問我,道長赦肋,這世上最難降的妖魔是什么澎办? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮金砍,結(jié)果婚禮上局蚀,老公的妹妹穿的比我還像新娘。我一直安慰自己恕稠,他們只是感情好琅绅,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹅巍,像睡著了一般千扶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骆捧,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天澎羞,我揣著相機(jī)與錄音,去河邊找鬼敛苇。 笑死妆绞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枫攀。 我是一名探鬼主播括饶,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼来涨!你這毒婦竟也來了图焰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蹦掐,失蹤者是張志新(化名)和其女友劉穎技羔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卧抗,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藤滥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颗味。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片超陆。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出时呀,到底是詐尸還是另有隱情张漂,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布谨娜,位于F島的核電站航攒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏趴梢。R本人自食惡果不足惜漠畜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坞靶。 院中可真熱鬧憔狞,春花似錦、人聲如沸彰阴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尿这。三九已至簇抵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間射众,已是汗流浹背碟摆。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叨橱,地道東北人典蜕。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像雏逾,于是被迫代替她去往敵國和親嘉裤。 傳聞我的和親對象是個(gè)殘疾皇子郑临,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容