索引表和ES的一點(diǎn)點(diǎn)思考

索引表設(shè)計(jì)


在電商項(xiàng)目中轨淌,物理庫存系統(tǒng)是個(gè)極其重要的系統(tǒng)迂烁,訂單支付后,就會(huì)開始來占用物理庫存递鹉。一般情況下盟步,庫存系統(tǒng)都是要分庫的,因?yàn)橹饕牟僮魇菍懖僮黪锝幔缯加?釋放/取消等寫操作却盘。使用分庫可以降低數(shù)據(jù)庫寫的壓力。盡管寫操作為主媳拴,但是讀操作也是有的黄橘。比如說,庫存占用的時(shí)候屈溉,得先查詢是否有庫存塞关,而這個(gè)查詢操作并不都會(huì)帶上分庫因子(用于路由到具體的某個(gè)數(shù)據(jù)庫),而是一些比較寬松的查詢條件子巾,這些查詢條件對應(yīng)的數(shù)據(jù)可能分布在不同的數(shù)據(jù)庫上帆赢。這個(gè)時(shí)候?yàn)榱瞬樵兊姆奖阈⊙梗瑫?huì)構(gòu)建一個(gè)索引表。這個(gè)索引表是存在另外的單獨(dú)的一個(gè)數(shù)據(jù)庫中椰于,不會(huì)再分庫了的怠益。

索引表的設(shè)計(jì)也分不同情況,大體可以分三種瘾婿。
1蜻牢、查詢字段+數(shù)據(jù)庫主鍵

把查詢字段放到索引表,還需要把對應(yīng)的數(shù)據(jù)庫主鍵ID也放置進(jìn)去偏陪。當(dāng)查詢請求到來時(shí)孩饼,根據(jù)查詢條件找出對應(yīng)的數(shù)據(jù)主鍵,再根據(jù)數(shù)據(jù)主鍵路由到對應(yīng)的存有完整業(yè)務(wù)數(shù)據(jù)的數(shù)據(jù)分庫上竹挡。這種方案呢。索引表占用空間小立膛,可以支撐很久揪罕。但是要找出業(yè)務(wù)數(shù)據(jù),還是需要路由到分庫上宝泵。另外好啰,如果要把索引表的數(shù)據(jù)存儲(chǔ)到ES搜索引擎上的話,這種方式就不行了儿奶。因?yàn)樗饕碇袥]有外部系統(tǒng)要的業(yè)務(wù)數(shù)據(jù)框往。所以當(dāng)時(shí)的庫存系統(tǒng)沒有使用這種索引表設(shè)計(jì)方案。

2闯捎、查詢字段+數(shù)據(jù)庫主鍵+需要展示的業(yè)務(wù)字段

這種方案呢椰弊。當(dāng)請求到來的時(shí)候,直接查詢索引表即可瓤鼻。無需根據(jù)主鍵路由到分庫了秉版。同時(shí)如果要結(jié)合ES的話〔绲唬可以直接把索引表的數(shù)據(jù)弄到ES上即可清焕。后續(xù)直接讓ES暴露查詢接口即可。目前我在唯品會(huì)參與的物理庫存項(xiàng)目中祭犯,是使用這種方式的秸妥。但是這個(gè)方案也有個(gè)缺點(diǎn)。就是索引表的體積比較大沃粗,后續(xù)數(shù)據(jù)量一大的話粥惧,也是個(gè)問題。能不能優(yōu)化一下呢陪每?

3影晓、索引表拆分

上面說到的第二種方案镰吵,索引表的膨脹可能很快,可以考慮將索引表拆分挂签。比如說:索引表只是保存查詢條件和主鍵疤祭,而需要展示給外部系統(tǒng)的數(shù)據(jù),另外存儲(chǔ)在單獨(dú)的表上饵婆。比如叫index_detail表勺馆。這個(gè)表擁有索引表的主鍵。這樣的話侨核,當(dāng)查詢請求到來的時(shí)候草穆,先從索引表查詢到主鍵,再根據(jù)主鍵從index_detail表中查詢出數(shù)據(jù)搓译。當(dāng)然這樣做的話悲柱。ES的數(shù)據(jù)來源就變成多張表了,不過這是可以接受的些己。


如何把業(yè)務(wù)數(shù)據(jù)寫入到索引表


使用MQ


一般來說豌鸡,構(gòu)建索引數(shù)據(jù)是使用單獨(dú)一個(gè)應(yīng)用來做的。比如叫data-index域段标。這個(gè)域會(huì)從消息隊(duì)列中讀取消息涯冠,用于構(gòu)建索引數(shù)據(jù)。當(dāng)業(yè)務(wù)數(shù)據(jù)發(fā)生變化后逼庞,生產(chǎn)者發(fā)送MQ消息到隊(duì)列上蛇更。
這里的消息設(shè)計(jì)也分兩種情況。一種是消息只是帶有數(shù)據(jù)主鍵和操作類型(ADD/Update/DELETE),消費(fèi)者拿到主鍵后再去DB獲取完整的數(shù)據(jù)并插入到索引表中赛糟。另一種方案呢派任,是消息包含了大部分需要的字段,消費(fèi)者拿到消息后直接把數(shù)據(jù)插入到索引表中璧南。這兩種消息設(shè)計(jì)吨瞎,我在實(shí)際項(xiàng)目中都有用過。


直接操作DB


這種方案呢就比較粗暴穆咐,直接配置一個(gè)索引表庫的數(shù)據(jù)源颤诀,當(dāng)業(yè)務(wù)數(shù)據(jù)發(fā)生變化時(shí),使用Mybatis或者JDBC把數(shù)據(jù)更新到索引表中对湃。一般不建議這么做崖叫,一來構(gòu)建索引數(shù)據(jù)的邏輯跟數(shù)據(jù)的CRUD操作融合在一起了。二來拍柒,操作其他數(shù)據(jù)庫的數(shù)據(jù)心傀,要么通過接口的方式,要么由單獨(dú)的域來做拆讯。建議還是使用MQ的方式來構(gòu)建索引數(shù)據(jù)脂男。


如何把索引表數(shù)據(jù)弄到ES上


監(jiān)聽數(shù)據(jù)庫表的數(shù)據(jù)變化


像在唯品會(huì)這邊养叛,自研了一個(gè)叫VDP的組件,使用storm job去監(jiān)聽索引表數(shù)據(jù)的變化宰翅,一旦有變化弃甥,就把數(shù)據(jù)同步到隊(duì)列中,ES直接從隊(duì)列中獲取數(shù)據(jù)汁讼,并存儲(chǔ)到ES上淆攻。
這種方案的好處是,我們無需寫任何代碼嘿架,數(shù)據(jù)自動(dòng)可以同步到ES上瓶珊。


使用MQ


如果公司內(nèi)部沒有開發(fā)VDP這樣的組件,可以通過發(fā)送MQ消息的方式來將索引表的數(shù)據(jù)同步數(shù)據(jù)到ES上耸彪。


讓ES暴露CUD接口


另外一種方案是伞芹,讓ES暴露CUD接口,用于同步索引表數(shù)據(jù)蝉娜。但是這樣就跟ES耦合在一塊了丑瞧。不太推薦這么做。


進(jìn)一步的思考


1蜀肘、ES不支持Group By這樣的操作,所以在構(gòu)建索引表的時(shí)候稽屏,可以事先計(jì)算好Group By的一些統(tǒng)計(jì)數(shù)據(jù)扮宠,并存儲(chǔ)到索引表中;
2狐榔、一些后臺(tái)應(yīng)用中坛增,如果數(shù)據(jù)庫表的數(shù)量已經(jīng)很大,好幾個(gè)億了薄腻,并且查詢的SQL還非常變態(tài)收捣,用數(shù)據(jù)庫已經(jīng)無法支持了,那么可以使用ES庵楷,查詢速度快罢艾,也支持一些統(tǒng)計(jì)操作;
3尽纽、使用ES輸出數(shù)據(jù)時(shí)咐蚯,也有個(gè)坑。經(jīng)常會(huì)拿到臟數(shù)據(jù)的弄贿。例如當(dāng)數(shù)據(jù)發(fā)送變化后春锋,構(gòu)建索引數(shù)據(jù)并把索引數(shù)據(jù)同步到ES上是需要時(shí)間的,但是我們后臺(tái)通常有將數(shù)據(jù)下架的操作差凹,下架的操作操作完后期奔,再次點(diǎn)擊查詢按鈕侧馅,可能還是看到臟數(shù)據(jù),因?yàn)閿?shù)據(jù)同步到ES上沒那么快∧琶龋現(xiàn)在我還沒想到很好的辦法來解決這個(gè)問題馁痴。歡迎網(wǎng)友提些建議。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搁胆,一起剝皮案震驚了整個(gè)濱河市弥搞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渠旁,老刑警劉巖攀例,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異顾腊,居然都是意外死亡粤铭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門杂靶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梆惯,“玉大人,你說我怎么就攤上這事吗垮《饴穑” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵烁登,是天一觀的道長怯屉。 經(jīng)常有香客問我,道長饵沧,這世上最難降的妖魔是什么锨络? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮狼牺,結(jié)果婚禮上羡儿,老公的妹妹穿的比我還像新娘。我一直安慰自己是钥,他們只是感情好掠归,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悄泥,像睡著了一般拂到。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上码泞,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天兄旬,我揣著相機(jī)與錄音,去河邊找鬼。 笑死领铐,一個(gè)胖子當(dāng)著我的面吹牛悯森,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绪撵,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼瓢姻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了音诈?” 一聲冷哼從身側(cè)響起幻碱,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎细溅,沒想到半個(gè)月后褥傍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喇聊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年恍风,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片誓篱。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朋贬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窜骄,到底是詐尸還是另有隱情锦募,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布邻遏,位于F島的核電站糠亩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏党远。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一富弦、第九天 我趴在偏房一處隱蔽的房頂上張望沟娱。 院中可真熱鬧,春花似錦腕柜、人聲如沸济似。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砰蠢。三九已至,卻和暖如春唉铜,著一層夾襖步出監(jiān)牢的瞬間台舱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竞惋,地道東北人柜去。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像拆宛,于是被迫代替她去往敵國和親嗓奢。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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