全文檢索、數(shù)據(jù)挖掘、推薦引擎系列1---技術(shù)架構(gòu)思考
我的小說《最老程序員創(chuàng)業(yè)札記-全文檢索、數(shù)據(jù)挖掘、推薦引擎應(yīng)用》的技術(shù)系列文章的第一篇,由于本人也是在一個(gè)LBS問答項(xiàng)目中使用,各方面考慮得不完善,希望能夠得到大家的幫助,謝謝大家的支持。
在后web2.0時(shí)代,簡(jiǎn)單的允許用戶產(chǎn)生內(nèi)容,連接用戶組成社交網(wǎng)絡(luò),滿足用戶個(gè)性化需求,已經(jīng)變成各個(gè)網(wǎng)站的標(biāo)配,不可能成為網(wǎng)站的特色和競(jìng)爭(zhēng)優(yōu)勢(shì)了。然而,隨著用戶產(chǎn)生內(nèi)容的增多,用戶與系統(tǒng)交互手段的豐富,用戶可供選擇的選項(xiàng)的增多,用戶迫切需要一種可以處理當(dāng)前信息爆炸時(shí)代的工具,可以迅速找到自己想要的內(nèi)容,更加容易的做出正確的決策,因此在后web2.0時(shí)代,全文檢索、數(shù)據(jù)挖掘、推薦引擎的應(yīng)用,將是各大網(wǎng)站下一輪競(jìng)爭(zhēng)的焦點(diǎn)。
但是應(yīng)用這三種技術(shù)需要一個(gè)統(tǒng)一的技術(shù)架構(gòu),在這個(gè)統(tǒng)一的架構(gòu)下,才能將全文檢索、數(shù)據(jù)挖掘、推薦引擎的功能發(fā)揮出來。我們將全文檢索、數(shù)據(jù)挖掘、推薦引擎統(tǒng)成為商業(yè)智能系統(tǒng),而與用戶交互的部分稱為前端系統(tǒng)。根據(jù)后臺(tái)商業(yè)智能系統(tǒng)的功能不同,可以將后臺(tái)商業(yè)智能系統(tǒng)分為三大類服務(wù):同步服務(wù)、異步服務(wù)、后臺(tái)線程。
- 同步服務(wù):主要處理用戶即時(shí)全文檢索查詢請(qǐng)求,給出推薦條目,通常同步服務(wù)使用異步服務(wù)或后臺(tái)進(jìn)程產(chǎn)生的商業(yè)智能數(shù)據(jù),這些數(shù)據(jù)存在緩存中如memcached或數(shù)據(jù)庫(kù)mysql中,通過Web Service或Restful方式提供
- 異步服務(wù):為了完成實(shí)時(shí)搜索、實(shí)時(shí)推薦等實(shí)時(shí)性需求,用戶的每個(gè)交互,在保存到數(shù)據(jù)庫(kù)中的同時(shí),系統(tǒng)會(huì)將該事件寫入消息服務(wù)器中,異步服務(wù)組件通過監(jiān)聽消息服務(wù)器上的topic來啟動(dòng)業(yè)務(wù)處理邏輯,從而實(shí)現(xiàn)近實(shí)時(shí)需求。例如,用戶為某個(gè)產(chǎn)品寫下評(píng)論或博客后,立即就可以通過全文檢索中查詢中該內(nèi)容,用戶對(duì)內(nèi)容的打分或投票也可以立即反映到給用戶的推薦列表中
- 后臺(tái)服務(wù):主要指需要長(zhǎng)時(shí)間在后臺(tái)運(yùn)行的服務(wù),例如聚合網(wǎng)站中對(duì)信息源的抓取,內(nèi)容批量導(dǎo)入的處理等等。這里有兩種情況,一種是定時(shí)任務(wù),需要在特定的時(shí)間或是時(shí)間間隔來完成,另一種是條件觸發(fā)的后臺(tái)任務(wù),例如在CPU利用率或并發(fā)數(shù)降低到一定程度后,后臺(tái)自動(dòng)運(yùn)行的任務(wù)
為了滿足上述需求,自然對(duì)所選用的技術(shù)和產(chǎn)品有一定的要求。在這里我想闡述一下我選擇產(chǎn)品的原則,首先選擇開源軟件,其次是如果可以用一種產(chǎn)品實(shí)現(xiàn)的功能,不建議采用兩種或多種產(chǎn)品組合來使用,雖然多種產(chǎn)品組合可能功能更為強(qiáng)大,但是配置的復(fù)雜性方面將成倍的提高,結(jié)果往往是得不償失的。
- 編程語言選擇:對(duì)于后臺(tái)的商業(yè)智能系統(tǒng)而言,數(shù)據(jù)處理需要強(qiáng)大的處理能力,顯然PHP、Python等不是最佳選擇,選擇Java可能更能滿足要求,因?yàn)榛贘ava的全文檢索、數(shù)據(jù)挖掘、推薦引擎均有成熟的開源軟件可供選擇,如Lucene、WEKA、Mahout等。另外,在性能擴(kuò)展方面,Hadoop是當(dāng)前的最通用的Map/Reduce選項(xiàng),其本身就是Java實(shí)現(xiàn)的
- 應(yīng)用服務(wù)器:考慮到需要同時(shí)滿足同步服務(wù)、異步服務(wù)及后臺(tái)進(jìn)程的需求,要求應(yīng)用服務(wù)器(Web服務(wù)器)具有消息中間件的功能,而單從這點(diǎn)來看,選擇Glassfish似乎是更好的選擇,因?yàn)門omcat再加上Httpd、ActiveMQ/OpenJMS配置相對(duì)要復(fù)雜一些
- 數(shù)據(jù)庫(kù)系統(tǒng):當(dāng)前對(duì)大型系統(tǒng)而言,常常糾結(jié)于選擇SQL還是NoSQL,NoSQL的性能好,但是不能處理復(fù)雜的查詢,而SQL可以處理復(fù)雜查詢,但是性能上又會(huì)差很多,通常的折衷解決方案是數(shù)據(jù)庫(kù)加緩存系統(tǒng),但是當(dāng)MySQL 5.6.2將InnoDB引擎與Memcached相結(jié)合之后,似乎選擇MySQL這種集成解決方案更具有優(yōu)勢(shì),這讓我們看到了SQL與NoSQL的融合趨勢(shì),這種方案的唯一缺陷是目前MySQL 5.6.2還沒有GA,這種方案還有成功案例可供借簽
綜上所述,個(gè)人認(rèn)為采用Java+Lucene+WEKA/Mahout+Glassfish+MySQL(>5.6.2)是實(shí)現(xiàn)后臺(tái)商業(yè)智能的合理架構(gòu)。
posted on 2011-08-11 09:30 最老程序員閆濤 閱讀(2054) 評(píng)論(3) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)