Java生鮮電商平臺-電商中海量搜索ElasticSearch架構設計實戰與源碼解析

Java生鮮電商平臺-電商中海量搜索ElasticSearch架構設計實戰與源碼解析

?

生鮮電商搜索引擎的特點

眾所周知,標準的搜索引擎主要分成三個大的部分,第一步是爬蟲系統,第二步是數據分析,第三步才是檢索結果。首先,電商的搜索引擎并沒有爬蟲系統,因為所有的數據都是結構化的,一般都是微軟的數據庫或者 Oracle 的數據庫,所以不用像百度一樣用「爬蟲」去不斷去別的網站找內容,當然,電商其實也有自己的「爬蟲」系統,一般都是抓取友商的價格,再對自己進行調整。

第二點,就是電商搜索引擎的過濾功能其實比搜索功能要常用。甚至大于搜索本身。什么是過濾功能?一般我們網站買東西的時候,搜了一個關健詞,比如尿不濕,然后所有相關品牌或者其他分類的選擇就會呈現在我們面前。對百度而言,搜什么詞就是什么詞,如果是新聞的話,可能在時間上會有一個過濾的選項。

第三點,電商搜索引擎支持各種維度的排序,包括支持好評、銷量、評論、價格等屬性的排序。而且對數據的實時性的要求非常高。對一般的搜索引擎,只有非常重要的網站,比如一些重量級的門戶網站,百度的收錄是非常快的,但是對那些流量很小的網站,可能一個月才會爬一次。電商搜索對數據的實時性要求主要體現在價格和庫存兩個方面。

電商搜索引擎另一個特點就是不能丟品,比如我們在淘寶、天貓開了個店鋪,然后好不容易搞了一次活動,但是卻搜不到了,這是無法忍受的。除此之外,電商搜索引擎與推薦系統和廣告系統是相互融合的,因為搜素引擎對流量的貢獻是最大的,所以大家都希望把廣告系統能跟其融合。當然,還有一點非常重要,就是要保證絕對的高可用,而且不能宕機。

電商搜索引擎的架構

因為電商搜索引跟一般的搜索引擎區別很大,所以在架構的設計上也獨具特色。首先,搜索引擎的實現方式有很多種,有谷歌、百度、搜狗這種非常大的公司,也有京東、淘寶、當當這樣的電商搜索引擎,很多中小型的電商可能更喜歡用一個開源的搜索引擎。所以總的來說,主要包括以下這幾種方式:

電商搜索引擎的架構設計和性能優化

第一種是「Lucene+自己封裝」,只用來做檢索,然后封裝,后面所有的 ES,這兩個是完整的解決方案,而且包括索引所有的東西,只需要部署好業務邏輯,然后查找結果就可以了。

第二種就是 Solr,這是一個高性能,采用 Java5 開發,基于 Lucene 的全文搜索服務器。同時對其進行了擴展,提供了比 Lucene 更為豐富的查詢語言,同時實現了可配置、可擴展并對查詢性能進行了優化,并且提供了一個完善的功能管理界面,是一款非常優秀的全文搜索引擎。

第三種是 ElasticSearch,這是一個基于 Lucene 的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 開發的,并作為 Apache 許可條款下的開放源碼發布,目前使用的也非常多。

這里提一下,當當的搜索引擎是自己實現的,。現在,新興的互聯網公司大部分都是使用第一種或者第二種,數據量比較大的一般采用第三種。

電商搜索引擎標配模塊

電商搜索引擎的架構設計和性能優化

接下來我想講一下,如果我們自己做一個搜索引擎的話需要實現哪些功能(上圖是電商搜索引擎的標準模塊),其實不止是電商搜索引擎,除了通搜的搜索引擎,其他的搜索引擎也是使用這樣的標配。

電商搜索引擎的架構設計和性能優化

對檢索模塊而言,首先是對用戶的意圖進行分析,根據用戶的搜索詞來進行純算法的實現。比如用戶的搜索詞是「黑包包」,其實用戶的本意就是買一個黑色的包,但是這個「包」可以跟別的詞組合在一起,甚至在搜索結果中會出現「包子」。所以,這就需要 query 分析系統來做,告訴檢索系統,你需要主要在服裝鞋帽中的分類去找,而不是生鮮食品類。

設計到技術層面,當當網使用的是 C++。如果構建一個性能好的系統,一些老一點的公司,大家都是在使用 C++ 或者是 C 語言。不止是當當網,其實很多公司都是使用的 C 或者 C++ 實現的搜索引擎。

數據更新模塊

電商搜索引擎的架構設計和性能優化

第二個模塊就是數據更新模塊,該模塊負責生成索引。而數據中心模塊主要做的事情,就是將原始的結構化數據,變成一個可供檢索系統使用的搜索數據庫。當然,數據更新模塊和檢索模塊是分開還是合并呢?其實從本質上講,都是一堆代碼,完全可以寫在一個進程里。當然,也可以分開,通過網絡往外輸入,各自都有道理。第一種是簡單粗暴型的,如果是普通電商,像生鮮電商,數據量不大,實時性、季節性很強,就可以把兩個系統用一個進程來完成。但是如果到了百萬、千萬甚至上億級別的話,就不可能部在一臺機器上了。

電商搜索引擎的架構設計和性能優化

上圖就是當兩個系統合并在一起的時候,紅色部分就是檢索系統,黃色部分是上游產生數據的系統,如果是淘寶的話,對接就是淘寶的商戶,當當網對接是市場部的人員,他們將數據錄入系統,推到數據庫,然后向下進行傳送,最終建立一個索引。

上圖中的藍色部分就是業務邏輯,因為電商的搜索引擎業務需求量非常高,尤其是現在大家都喜歡用手機進行購物,像手機專享價就是一個新的業務,這也意味著需要一個專用的模塊來處理這些商用的邏輯。

此外,就是用戶行為的分析,我們搜集到的日志還有其他相關的數據都會存到 Hadoop 集群上去,通過離線計算,然后傳給商業模塊或者排序模塊進行排序和打分,并提供給用戶更好的使用體驗。

出問題是不可避免的!如何解決?

雖然整理來看,設計的思路是非常合理的,但是還是會出現問題。一般而言,一個成熟的電商搜索系統,它的問題都很集中,要這幾種情況:首先就是 Bug,當然這是所有系統都會遇到的問題;第二個就是并發,但是搜索系統是沒辦法進行分庫分表,所以能做的就是索引切分;最后一點就是監控,包括問題追蹤、日志系統和監控系統,那么為了解決這些問題,我們應該怎么做?

首先,針對 Bug 問題,只能靠自動化運維去解決(這里也推薦使用 OneAPM 工具);第二個就是高并發的問題,目前主要是靠緩存和橫向擴展。而緩存和橫向擴展怎么應用到系統中去,這個很關鍵。很多人也說可以換一種語言,比如講 Python 換成 C++,但實際情況下,換語言并不能解決并發的問題,好的數據結構的設計比換一種語言更能提高性能,所以一般解決高并發問題的也就是緩存和橫向擴展。

第三個就是使用用 FLUME 日志系統(Flume 是 Cloudera 提供的一個高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸的系統,Flume 支持在日志系統中定制各類數據發送方,用于收集數據;同時,Flume 提供對數據進行簡單處理,并寫到各種數據接受方(可定制)的能力)。其實,Flume 會把集群上每一個節點的日志全都收集起來,這樣做起來有兩個好處,第一是現場出問題,可以先回滾出 Bug,然后進行查詢。第二個就是對日志進行搜集,然后做用戶行為分析,查看用戶點擊了多少次,從何處導入的流量等等,從而便于更好的進行排序。

電商搜索引擎的架構設計和性能優化

然后講一下緩存的問題。一般搜索的緩存可能分為兩級緩存,據我觀察,像搜狗可能是使用頁面級緩存,而百度可能用的是索引級的緩存。比如在搜狗搜索一個詞,開始時可能需要 40 毫秒,然后再搜的話,就可能一下子降到 1 毫秒。這就是頁面級緩存。而百度可能第一次搜索用了 40 毫秒,第二次就是 25 毫秒,它并不是把頁面給緩存下來,而是將索引的倒排鏈緩存,級別其實是不一樣的。

電商搜索很多使用的是兩級緩存,對于特別熱門的詞匯,我們可以做頁面級緩存,而頁面級緩存的時間只有 15 秒到 20 秒。但是像價格這樣的東西不能緩存,需要前臺頁面去反拉價格。第二級就是索引級別的緩存,實際上也是自建的一個緩存系統。另外,排序也有緩存,因為排序的結果不太會有太大的變化。

電商搜索引擎的架構設計和性能優化

上圖是當當的搜索架構,這里有一個集群是做數據分析的,上面備滿了數據。

首先,集群之間采用什么樣的通訊方式?我們主要使用 ZMQ(這是一個簡單好用的傳輸層,像框架一樣的一個 socket library,使得 Socket 編程更加簡單、簡潔和性能更高。是一個消息處理隊列庫,可在多個線程、內核和主機盒之間彈性伸縮)。原因其實只有一個,就是快,非常快,比較適合數據量比較大的業務。

如何避免冷啟動?

最后就是冷啟動的問題,這個問題是很多電商網站都很頭疼的問題。尤其是隨著電商網站的商品數量達到一定量級的時候,比如已經上億了,像淘寶、天貓的話應該更多。如果重建了一次索引需要啟動,或者新上線了一個業務模塊,需要重啟系統,是很麻煩的。

當然,當集群大了以后有很多方法,比如分開啟動之類的,至于技術嘛,一般索引的加載都是使用 Lunix 標準的 MMAP(MMAP 將一個文件或者其它對象映射進內存。文件被映射到多個頁上,如果文件的大小不是所有頁的大小之和,最后一個頁不被使用的空間將會清零。MMAP 在用戶空間映射調用系統中作用很大),這樣啟動速度會很快,但是系統會有預熱時間,前面一些時間的查詢會比較慢

如果數據量不是特別大的話,而且現在內存也那么便宜,完全可以將數據一次性讀入內存,因為 mmap 的操作畢竟性能沒有直接內存來得快。

第三種的話,就是盡量減少做全量數據的頻率,避免整個系統的重啟,這需要定期做一下索引的優化,把沒用的索引干掉。

如果是新上了一個業務模塊需要重啟集群,這樣的事情最好不要發生,這就是架構有問題了,將業務模塊變成外部的模塊或者插件進行上線才是正確的,不然每上線一個模塊需要重啟集群,這誰都受不了。

?

轉載于:https://www.cnblogs.com/jurendage/p/11328959.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247188.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247188.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247188.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

并行批處理多個文件 matlab

%初始化matlab并行運行環境 % Initialize Matlab Parallel Computing Environment CoreNum2; %設定機器CPU核心數量&#xff0c;我的機器是雙核&#xff0c;所以CoreNum2 if matlabpool(size)<0 %判斷并行計算環境是否已然啟動 matlabpool(open,local,CoreNum); %若尚未啟動…

答應我不要問TCP三次握手四次揮手

衍生頭疼問題如下。 請畫出三次握手和四次揮手的示意圖為什么連接的時候是三次握手&#xff1f;什么是半連接隊列&#xff1f;ISN(Initial Sequence Number)是固定的嗎&#xff1f;三次握手過程中可以攜帶數據嗎&#xff1f;如果第三次握手丟失了&#xff0c;客戶端服務端會如…

專業術語常用名詞縮寫中英文對照

A:Actuator 執行器A:Amplifier 放大器A:Attendance員工考勤A:Attenuation衰減AA:Antenna amplifier 開線放大器AA:Architectural Acoustics建筑聲學AC:Analogue Controller 模擬控制器ACD:Automatic Call Distribution 自動分配話務ACS:Access Control System出入控制系統AD:Ad…

推薦!國外程序員整理的機器學習資源大全

本列表選編了一些機器學習領域牛B的框架、庫以及軟件&#xff08;按編程語言排序&#xff09;。 C 計算機視覺 CCV —基于C語言/提供緩存/核心的機器視覺庫&#xff0c;新穎的機器視覺庫OpenCV—它提供C, C, Python, Java 以及 MATLAB接口&#xff0c;并支持Windows, Linux,…

做任務一定要看測試用例

做任務的時候一定要一開始就看測試用例。雖然有的任務自己很熟&#xff0c;但是如果不時時關注測試用例的話&#xff0c;還是容易走偏&#xff0c;到后頭再去修改的話&#xff0c;會浪費不少時間。 轉載于:https://www.cnblogs.com/superhuake/archive/2011/09/09/2172008.html…

深度學習鼻祖杰夫·辛頓及巨頭們的人才搶奪戰

摘要&#xff1a;深度學習已經誕生了數十年時間&#xff0c;但直到近幾年才受到各大科技公司的重視&#xff0c;被認為是硅谷科技企業的未來&#xff0c;今天為大家介紹的是深度學習的開山鼻祖Geoffrey Hinton。在過去的三十年&#xff0c;深度學習運動一度被認為是學術界的一個…

EM算法(Expectation Maximization Algorithm)

文章目錄 1. 前言 2.基礎數學知識2.1.凸函數2.2.Jensen不等式 3.EM算法所解決問題的例子 4.EM算法4.1.模型說明 4.2.EM算法推導 4.3.EM算法收斂性證明 4.4. EM算法E步說明 5.小結 6.主要參考文獻1. 前言 這是本人寫的第一篇博客(2013年4月5日發在cnblogs上,現在遷移過來)&#…

Julia語言:讓高性能科學計算人人可用

摘要&#xff1a;一群科學家對現有計算工具感到不滿&#xff1a;他們想要一套開源系統&#xff0c;有C的快速&#xff0c;Ruby的動態&#xff0c;Python的通用&#xff0c;R般在統計分析上得心應手&#xff0c;Perl的處理字符串處理&#xff0c;Matlab的線性代數運算能力……易…

View Animation

轉載一篇關于view animation的文章 http://blog.csdn.net/nerohoop/article/details/7245909 補充&#xff1a;當啟用animation來改變值的時候&#xff0c;值是立刻就改變了的&#xff0c;然后才開始動畫。 轉載于:https://www.cnblogs.com/mystory/archive/2012/12/18/2824029…

編程能力的四種境界

人類心理學研究中的一個基礎支撐科目就是分析人的潛意識和意識。 弗洛伊德是最早的一位能夠清楚的認定和描述我們的心理活動“領域”的人。 在他這著名的一生的早期&#xff0c;他就指出我們的意識里分“潛意識”&#xff0c;“前意識”&#xff0c;“意識”。 如 果我們想能清…

ファイルアップロード関連のjQueryプラグイン10攻略

ファイルアップロード関連のjQueryプラグイン&#xff11;&#xff10;ファイルアップロードといってもSWFを使ったりAJAXを使ったりと方法が色々あって、いろんなやり方ができるjQueryプラグインです。望みの挙動に近いものを選んでカスタマイズすれば作りたいものが最速で作れ…

HTTP報文(轉)

HTTP報文http://www.cnblogs.com/kissdodog/archive/2013/04/01/2993228.html之前寫過一篇HTML報文&#xff0c;但是感覺寫完之后還是不懂&#xff0c;最近終于有時間開始看《HTTP權威指南》&#xff0c;看完之后覺得還是比之前的理解更加深入了&#xff0c;提取HTTP報文出來做…

C#基礎-應用程序域

文章導讀同一臺計算上的應用程序是通過進程來隔離的&#xff0c;每個應用程序都是加載到不同的進程中&#xff0c;從而達到應用程序的互不影響。操作系統【OS】通過進程控制塊【PCB】感知進程的存在&#xff0c;分析【PCB】的數據結構可以發現&#xff0c;【PCB】維護進程運行的…

Java生鮮電商平臺-微服務入門與服務的拆分架構實戰

Java生鮮電商平臺-微服務入門與服務的拆分架構實戰 剛開始進入軟件行業時還是單體應用的時代&#xff0c;前后端分離的概念都還沒普及&#xff0c;開發的時候需要花大量的時間在“強大”的JSP上面&#xff0c;那時候SOA已經算是新技術了。現在&#xff0c;微服務已經大行其道&a…

詳解MTK系統中字符轉換問題

詳解MTK系統中字符轉換問題 2011-09-05 19:02 佚名 互聯網 字號&#xff1a;T | TMTK系統中字符轉換問題是本文要介紹的內容&#xff0c;主要是來了解并學習MTK中一些小案例的應用&#xff0c;具體內容來看本文詳解。 AD&#xff1a;2014WOT全球軟件技術峰會北京站 課程視頻發布…

Java生鮮電商平臺-微服務架構概述

Java生鮮電商平臺-微服務架構概述 單體架構存在的問題 在傳統的軟件技術架構系統中&#xff0c;基本上將業務功能集中在單一應用內&#xff0c;或者是單一進程中。盡管現代化的軟件架構理論以及設計原則已推廣多年&#xff0c;但實際技術衍化的速度遲緩并且變革動力不足。 其中…

Jensen不等式及其證明

? 詹森不等式以丹麥數學家約翰詹森&#xff08;JohanJensen&#xff09;命名。它給出積分的凸函數值和凸函數的積分值間的關系。 關于凸函數&#xff1a; if &#xff08;-f&#xff09;是凸函數&#xff08;convex&#xff09;&#xff0c;則f是凹的&#xff08;concave…

ios自帶NSURLConnection下載文件

//同步下載,同步請求的主要代碼如下 - (IBAction)downLoad:(id)sender { NSString *urlAsString"http://7jpnsh.com1.z0.glb.clouddn.com/TravelDemo.plist";//文件地址 NSURL *url[NSURL URLWithString:urlAsString]; NSURLRequest *request[NSURLRequest requestWi…

國外程序員整理的機器學習資源大全

本列表選編了一些機器學習領域牛B的框架、庫以及軟件&#xff08;按編程語言排序&#xff09;。 C 計算機視覺 CCV —基于C語言/提供緩存/核心的機器視覺庫&#xff0c;新穎的機器視覺庫 OpenCV—它提供C, C, Python, Java 以及 MATLAB接口&#xff0c;并支持Windo…

五款幫助創業者迅速熟悉互聯網創業的在線學習工具

相信很多有志青年都想借助互聯網開拓自己的事業&#xff0c;可是經常面臨一個很現實的問題——缺乏一定的專業知識和技能。沒關系&#xff0c;互聯網中的豐富教育資源就可以讓你迅速地跨越這一障礙&#xff0c;熟悉與創業相關的運營、管理、融資等操作技巧。下面介紹的五個在線…