轉(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)歷澡刹。