董勤
摘要 為解決某汽車門戶網(wǎng)站新老業(yè)務(wù)模式不斷變化,老系統(tǒng)的數(shù)據(jù)格式和新需求不匹配,老系統(tǒng)沒有對外的通用訪問接口,不斷產(chǎn)生信息孤島,以及用戶不斷增長導(dǎo)致系統(tǒng)性能無法滿足需要等問題,本文首先對門戶的資訊、評測、車型、經(jīng)銷商門店、客服等功能模塊進(jìn)行分析,找出原因,接著通過采用消息中間件和數(shù)據(jù)緩存中間件技術(shù)有針對性地對相關(guān)問題模塊進(jìn)行改造、重構(gòu),最終通過嚴(yán)格測試,并成功上線運(yùn)行。模塊重構(gòu)工作歷時(shí)6個月,于2017年9月成功上線,改造后的門戶網(wǎng)站提高了經(jīng)銷商店鋪訪問流量和轉(zhuǎn)化率,最終達(dá)到了技術(shù)效果和經(jīng)濟(jì)效益雙豐收。
【關(guān)鍵詞】中間件技術(shù) 應(yīng)用 數(shù)據(jù)訪問 門戶網(wǎng)站
1 引言
中間件技術(shù)伴隨著互聯(lián)網(wǎng)爆炸式發(fā)展也一直在高速發(fā)展中,一直沒有固定的精確的定義,維基百科對它的基本解釋是為軟件應(yīng)用提供操作系統(tǒng)之外的膠水服務(wù),它既不是操作系統(tǒng)本身,也不是數(shù)據(jù)庫系統(tǒng),更不是應(yīng)用系統(tǒng),而是處在這三者中間的服務(wù)提供者,起到應(yīng)用與系統(tǒng)、應(yīng)用與數(shù)據(jù)庫、應(yīng)用與應(yīng)用之間的橋梁作用。垂直門戶網(wǎng)站某汽車網(wǎng)f下稱汽車網(wǎng))由于業(yè)務(wù)發(fā)展迅速,新老業(yè)務(wù)模式不斷變化,每一年均需要順應(yīng)市場需求,針對不同的業(yè)務(wù)類型開發(fā)各種新的功能模塊。許多老的應(yīng)用系統(tǒng)依然有效而表現(xiàn)形式和應(yīng)用方式已經(jīng)發(fā)生較大變化,老系統(tǒng)的數(shù)據(jù)格式和新需求不匹配,老系統(tǒng)沒有對外的通用訪問接口,成為一個個獨(dú)立的信息孤島。同時(shí),隨著市場影響力的增強(qiáng),用戶規(guī)模不斷擴(kuò)大,系統(tǒng)的訪問壓力與日俱增,有時(shí)會發(fā)生頁面卡頓,白頁等現(xiàn)象。為了解決這些問題,2017年公司領(lǐng)導(dǎo)開會討論決定立項(xiàng)對平臺的資訊、評測、車型、經(jīng)銷商門店、客服等老模塊進(jìn)行應(yīng)用集成和性能優(yōu)化的重構(gòu)工作??v向上改造老的信息系統(tǒng),發(fā)揮它們的價(jià)值;橫向上整合不同業(yè)務(wù)部門的信息系統(tǒng),讓有價(jià)值的信息在不同業(yè)務(wù)部門之間共享。
汽車網(wǎng)面臨的問題也是業(yè)界普遍存在的問題,大型公司如IBM、Oracle、Microsoft等巨頭有商用解決方案,如WebService套件、Portal套件、MQ套件以及各種數(shù)據(jù)庫解決方案。通常這些中間件的確能解決一些問題,但是由于互聯(lián)網(wǎng)業(yè)務(wù)場景各不相同,因此這些通用套件也不能完全精準(zhǔn)解決各個問題,另外,商業(yè)中間件實(shí)施起來費(fèi)用昂貴,性價(jià)比有待考量。
汽車網(wǎng)最終根據(jù)本身問題特征,為自己量身定制了一套解決方案,采用開源的消息中間件、數(shù)據(jù)中間件、以及獨(dú)創(chuàng)的數(shù)據(jù)緩存技術(shù),既解決了問題,又節(jié)約了資金,具有很好的性價(jià)比。
2 關(guān)鍵技術(shù)分析
2.1 用消息中間件打通信息孤島并提高時(shí)效性
在汽車網(wǎng)中,有一個非常重要的功能模塊一一經(jīng)銷商門店,它肩負(fù)著企業(yè)商業(yè)轉(zhuǎn)化的重要使命。用戶訪問網(wǎng)站,享受免費(fèi)的最新汽車信息,玩車攻略,汽車報(bào)價(jià)對比等等,順便訪問一下經(jīng)銷商門店頁面,如果剛好有需要進(jìn)行購車、保養(yǎng)、購買零配件等服務(wù),他會在線報(bào)名下單,填寫自己的名字、手機(jī)號、想要購買的產(chǎn)品或服務(wù);這個信息被稱之為銷售線索。每條銷售線索需要在不同的業(yè)務(wù)系統(tǒng)中流轉(zhuǎn),首先網(wǎng)站報(bào)名后臺需要第一時(shí)間知道這個信息,并且給客戶發(fā)送確認(rèn)短信,告訴他將會在24小時(shí)內(nèi)得到服務(wù);其次銷售線索會進(jìn)入到直銷車模塊、團(tuán)購車模塊和平行進(jìn)口車模塊,由不同的業(yè)務(wù)部門對他進(jìn)行回訪處理;最后銷售線索還會傳送給對應(yīng)的經(jīng)銷商門店系統(tǒng),能提供相應(yīng)服務(wù)的經(jīng)銷商會再次對他進(jìn)行回訪,確認(rèn)購買內(nèi)容。
由于網(wǎng)站是一步一步發(fā)展起來的,各種應(yīng)用系統(tǒng)如資訊服務(wù)系統(tǒng)、報(bào)名模塊、經(jīng)銷商系統(tǒng)、直銷車系統(tǒng)、團(tuán)購車系統(tǒng)、客服系統(tǒng)都是各自在不同歷史時(shí)期獨(dú)立建設(shè)起來的;他們之間不可能用同一個數(shù)據(jù)庫,即使用了數(shù)據(jù)庫性能也無法滿足要求,因此形成了一個個獨(dú)立的信息孤島。但用戶報(bào)名的數(shù)據(jù)是珍貴的潛在銷售線索,如果報(bào)名的時(shí)候在各大系統(tǒng)都插入,則用戶等待時(shí)間太長,導(dǎo)致用戶體驗(yàn)糟糕而降低網(wǎng)站信譽(yù),因此只能插入一個系統(tǒng),而其它有需要的系統(tǒng)在另外的時(shí)間再來獲取,但這樣造成時(shí)間滯后,客戶服務(wù)質(zhì)量無法得到可靠保證。
消息中間件的推送特性既能起到信息孤島之間的橋梁作用,又具有優(yōu)秀的時(shí)效性。經(jīng)過反復(fù)選型,在Kafka、MetaQ、ActiveMQ、ZeroMQ等多種可選項(xiàng)中,本次改造采用開源的RocketMQ消息隊(duì)列技術(shù),既有優(yōu)異的性能,又有頂級的Apache開源社區(qū)作為后續(xù)技術(shù)保障。具體實(shí)施的時(shí)候,用戶在一處填寫的報(bào)名信息除了插入后臺DB之外,同時(shí)發(fā)布到消息隊(duì)列中去,不同業(yè)務(wù)部門前來訂閱這個消息,團(tuán)購部門、直銷車部門、平行進(jìn)口車部門、經(jīng)銷商網(wǎng)店系統(tǒng)以及客服系統(tǒng)均可根據(jù)自己的需要選擇需要訂閱的報(bào)名線索。當(dāng)用戶報(bào)名的時(shí)候,這些部門都能在第一時(shí)間得到資料,第一時(shí)間回訪客戶,改善了客戶體驗(yàn),提高了商業(yè)運(yùn)作的效率,同時(shí)提高了銷售線索的轉(zhuǎn)化率,從而增強(qiáng)了汽車網(wǎng)的市場競爭力。
2.2 采用內(nèi)存數(shù)據(jù)中間件解決性能問題
汽車網(wǎng)有很多老的系統(tǒng)應(yīng)用層直接連接db進(jìn)行增刪改查操作,系統(tǒng)的整體性能無法滿足日益增長的需求,因此增加了內(nèi)存數(shù)據(jù)中間件作為數(shù)據(jù)訪問層。在DBMS中,數(shù)據(jù)是以元組的形式存儲,但是可以通過巧妙的處理映射到內(nèi)存對象,以鍵值對方式存儲,如一條記錄對應(yīng)一個內(nèi)存鍵值對。汽車網(wǎng)數(shù)據(jù)中間層中以[表名:字段名:主鍵值]組合作為鍵,新建一個map為對應(yīng)值;這個map內(nèi)部的每一個子key對應(yīng)元組的每一個字段,同時(shí)每一個子value對應(yīng)該字段的值。具體實(shí)施中采用了10臺大內(nèi)存linux服務(wù)器,合計(jì)640G內(nèi)存,專門來做基于redis3.0 cluster的分布式數(shù)據(jù)緩存層,分為20個節(jié)點(diǎn),每個節(jié)點(diǎn)有主從實(shí)例。服務(wù)端對客戶端傳來的鍵進(jìn)行散列、定位到節(jié)點(diǎn);如果有新節(jié)點(diǎn)加入或者老節(jié)點(diǎn)刪除,集群會根據(jù)一致性hash算法自動更新集群結(jié)構(gòu):經(jīng)常需要訪問的數(shù)據(jù)如最近2年的經(jīng)銷商新聞數(shù)據(jù)、最近2年的車型問答數(shù)據(jù)被裝入redis中,實(shí)現(xiàn)冷數(shù)據(jù)熱數(shù)據(jù)分離。業(yè)務(wù)層直接從緩存訪問數(shù)據(jù),無需連接DB;極大節(jié)約DB連接和查詢開銷。經(jīng)過對比,在當(dāng)前的業(yè)務(wù)模式下,老的mysql db -秒鐘最多能處理1K次請求,增加數(shù)據(jù)訪問層之后,查詢速度立刻上升了10倍,接近1萬次/秒。由于大部分業(yè)務(wù)還達(dá)不到這么大的量級,業(yè)務(wù)的伸縮性因而得到了有效的保障。如果將來有新的業(yè)務(wù)需要緩存,還可以無縫透明的往集群中添加節(jié)點(diǎn),一致性哈希算法能自動將新節(jié)點(diǎn)分配到集群中,并且會將一部分鍵值對分配進(jìn)來存儲;這些為系統(tǒng)的擴(kuò)展性提供了有力保證。另外由于數(shù)據(jù)訪問層的加入,客戶端的許多業(yè)務(wù)經(jīng)過一定的改造,將不會接受sql語句直接查詢db,對sql入侵也是一種根本性的防范,安全性得到有力的保障。
由于采取了redis集群作為數(shù)據(jù)中問件,業(yè)務(wù)導(dǎo)致的一些數(shù)據(jù)變化甚至是DB內(nèi)主動發(fā)生的變化無法及時(shí)更新到緩存,從而導(dǎo)致業(yè)務(wù)層讀取到過期數(shù)據(jù)的可能。為了解決這個問題,消息隊(duì)列中問件被再次采用以實(shí)現(xiàn)數(shù)據(jù)狀態(tài)變化通知,令緩存及時(shí)更新。當(dāng)前端業(yè)務(wù)主動改變db數(shù)據(jù)的時(shí)候,如涉及到插入或者更新操作,將對應(yīng)的key作為消息發(fā)布到消息隊(duì)列,同時(shí)有專門的進(jìn)程訂閱該消息,從而進(jìn)一步將redis內(nèi)對應(yīng)key的value值進(jìn)行更新,或者將此key值設(shè)置為過期。當(dāng)前端業(yè)務(wù)查詢到過期數(shù)據(jù)時(shí)便再次從db內(nèi)查詢出最新的數(shù)值同時(shí)同步到redis中。
3 實(shí)施中的獨(dú)創(chuàng)工作
汽車網(wǎng)重構(gòu)過程中,內(nèi)存數(shù)據(jù)中問件技術(shù)被大范圍使用,在具體實(shí)施的過程中,發(fā)現(xiàn)其索引功能尚處于空白狀態(tài),這里介紹一個獨(dú)創(chuàng)的設(shè)計(jì):類redis的純內(nèi)存數(shù)據(jù)庫,姑且命名為Qdis,除了基本的key-value存儲功能之外,最大的創(chuàng)新之處是允許它和傳統(tǒng)的DBMS -樣支持對查詢條件自動建索引。以車型數(shù)據(jù)庫為例,傳統(tǒng)的DBMS存儲方式是元組式,如(id,品牌,車系,車型,顏色,年份,發(fā)動機(jī)型號);存入Qdis的方式是以”表名:主鍵字段名:主鍵ID”為key, value為一個map,這個map的每一個子key是該元組的字段,如品牌,子value為對應(yīng)的值如Benz。假設(shè)在數(shù)據(jù)庫內(nèi)對年份字段做了索引,很容通過SQL查出年份為2015款benz E300的紀(jì)錄。在Qdis中,根據(jù)用戶設(shè)置可對年份這個子key做自動索引,索引本身是樹形結(jié)構(gòu),”年份”放在有序set中保證唯一性,每個索引對應(yīng)一個list,里而放對應(yīng)的車型主鍵(可能多個):如年份這個字段建好索引后,各年份對應(yīng)的車型主鍵將分別被存放在一個個list中;以后只要查詢2015年的車子,則這個list中的車型主鍵立刻就有了。重要的是,這一切都在內(nèi)存內(nèi)發(fā)生,而且Qdis提供一鍵自動化建索引腳本,還可根據(jù)數(shù)據(jù)變化自動更新。這么做的優(yōu)點(diǎn)是:Qdis離內(nèi)存數(shù)據(jù)庫又邁出了實(shí)際性的一步。讓復(fù)雜查詢變得更加快速容易。
4 結(jié)論
(1)采用消息隊(duì)列RocketMQ之后,既充分利用了歷史遺留系統(tǒng),同時(shí)還實(shí)現(xiàn)了跨部門的協(xié)同工作,提高了工作效率,縮短了用戶等待時(shí)問,改善了用戶體驗(yàn),增強(qiáng)了用戶的商業(yè)轉(zhuǎn)化率。
(2)采用基于內(nèi)存的數(shù)據(jù)中問件之后,極大提升了數(shù)據(jù)訪問速度,性能提升了一個數(shù)量級,消除了卡頓白頁等歷史問題,同時(shí)搜索引擎的連通率也得到成倍增長,進(jìn)而增強(qiáng)了市場影響力。
(3)施工時(shí)獨(dú)創(chuàng)的內(nèi)存自動建索引的技術(shù)讓數(shù)據(jù)中問件不再難用,既保證系統(tǒng)性能,又提升了工程師們的開發(fā)效率。半年多的線上穩(wěn)定運(yùn)行證明,中問件技術(shù)極大改善了互聯(lián)網(wǎng)應(yīng)用的服務(wù)品質(zhì),得到了用戶的充分肯定。
參考文獻(xiàn)
[1]羅宏俊,馮瑞,基于Web技術(shù)進(jìn)行移動應(yīng)用開發(fā)和中間件的研究[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2017
[2]肖建軍,基于中間件技術(shù)的水文信息處理系統(tǒng)的開發(fā)與應(yīng)用[J].北方工業(yè)大學(xué),2017.
[3]葛東遙.消息中間件管理和監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].北京交通大學(xué),2017.
[4]譚江山.基于中間件技術(shù)的釘釘與現(xiàn)有OA系統(tǒng)集成探討[J].電子制作,2017 (06).
[5]王慕所.面向組件的通信中間件技術(shù)研究[J].浙江大學(xué),2017.
[6]薛皓.基于分布式數(shù)據(jù)庫中間件的混合類型數(shù)據(jù)管理研究[J].東華大學(xué),2017.