全文檢索、數(shù)據(jù)挖掘、推薦引擎系列2---異步服務(wù)實現(xiàn)
正向前一篇分析的,在全文檢索、數(shù)據(jù)挖掘、推薦引擎的后臺系統(tǒng)中,通常可以提供三種類型的服務(wù):同步服務(wù)、異步服務(wù)、后臺服務(wù)。對于同步服務(wù)可以采用Web Service、XML Over HTTP或Restful服務(wù),我在項目中就采用了Jason over HTTP,主要考慮Javascript解析Json效率較高,但是還要看各人喜好。對于異步服務(wù)在實現(xiàn)上,如果選用Java做為編程語言,基本就需要選擇JMS了。而后臺服務(wù)主要是定時任務(wù),可以采用新版JEE中的Timer服務(wù),或直接使用Timer。
在JMS實現(xiàn)異步服務(wù)中,最簡單的方法是采用消息驅(qū)動Bean來實現(xiàn),但是JMS中有兩種機制:一種是Queue,另一種是Topic,那么選哪種好呢?通常在需要松藕合系統(tǒng)中,由于業(yè)務(wù)邏輯非常復(fù)雜,需求集成多個系統(tǒng)及功能,而且系統(tǒng)及功能可能在運行時加入等原因,一般采用消息總線機制,如OpenESB。這種特性也是我的系統(tǒng)中所需要,但是引入重量級的ESB技術(shù)又是我所不愿意的,因此我選擇了JMS Topic模式來實現(xiàn)消息驅(qū)動Bean。這樣即使當(dāng)系統(tǒng)上線后,要加入新功能,例如新用戶注冊時,需要將用戶信用卡信息加入緩存中(原來只是將登錄名密碼加入到了緩存中),這時就可以動態(tài)部署一個新的消息驅(qū)動Bean,這樣系統(tǒng)可以不進(jìn)行任何修改加入新功能,實現(xiàn)類似消息總線機制。
為此,我在系統(tǒng)中建立了消息驅(qū)動Bean-MainMdb,用于監(jiān)聽jms/MainTopic這個Topic。
例如,當(dāng)用戶發(fā)布一條博客信息時,Web前端系統(tǒng)首先將該博客的信息存入數(shù)據(jù)庫,然后會向jms/MainTopic發(fā)送一條消息,消息類別為博客添加,參數(shù)為博客編號。后臺的消息驅(qū)動Bean收到該消息,在onMessage方法中,通過博客編號,找到博客的詳細(xì)信息,然后將標(biāo)題、標(biāo)簽、關(guān)鍵字、摘要、正文等文本信息建立全文檢索索引,然后會計算文章分詞后每個詞在本篇博客中的出現(xiàn)頻率以及與本博客的相關(guān)度(即TF/iDF,計算方法在本系列后續(xù)文章中會介紹到),建立術(shù)語向量空間,運行自動聚類算法,找出基于內(nèi)容的相似博客,同時根據(jù)需要,可能還需要和用戶進(jìn)行自動聚類分析,找到可能喜歡這篇博客的用戶。通常由于建立全文索引和進(jìn)行基于內(nèi)容的推薦引擎計算需要較長時間,如果采用同步服務(wù),那么用戶等待時間會比較長,用戶體驗不好,但是如果采用異步服務(wù)方式實現(xiàn),可以立即向用戶顯示成功信息,耗時工作采用異步方式來完成。但是用戶如果再進(jìn)行下一步操作時,如進(jìn)行全文檢索,查看其他博客或其他用戶等,由于已經(jīng)過去了對系統(tǒng)來說足夠長的時間,全文索引和基于內(nèi)容的推薦運算已經(jīng)完成,因此可以呈獻(xiàn)出準(zhǔn)實時的效果。
浙公網(wǎng)安備 33010602011771號