文檔目的
目前查重功能的主要問題
目前系統(tǒng)的查重功能只用在立項(xiàng)表單的提交功能上枝冀。當(dāng)立項(xiàng)功能提交時(shí)觸發(fā)查重檢查吠裆。由于查重算法本身性能不是很快吞鸭,在文檔有1000多個(gè)時(shí)耗時(shí)大概5秒多俊扳;如果文檔數(shù)量增加远寸,耗時(shí)只會(huì)更多抄淑。
文檔的要點(diǎn)
本文檔主要討論雙創(chuàng)查重模塊性能改進(jìn)的方式方法屠凶。核心目標(biāo)是改善用戶體驗(yàn)驰后。我們也許最終沒有加快查重算法的性能,但是矗愧,我們的目標(biāo)是改善用戶的體驗(yàn)灶芝。使用戶在使用過程中不會(huì)有不舒服的情緒。
文檔目錄
本文檔討論話題如下:
- 預(yù)先觸發(fā)
- 支持增量數(shù)據(jù)
- 保存運(yùn)行結(jié)果
- 改進(jìn)運(yùn)行節(jié)點(diǎn)
- 多節(jié)點(diǎn)運(yùn)行
支持增量數(shù)據(jù)
目前的程序不支持增量查重?cái)?shù)據(jù)唉韭,這意味著新通過的成果推廣或者立項(xiàng)無法作為參考依據(jù)夜涕。可改進(jìn)程序属愤,支持增量數(shù)據(jù)寫入緩存女器。
改進(jìn)點(diǎn)
立項(xiàng)
1、立項(xiàng)通過后住诸,添加到文檔查重緩存中
2驾胆、立項(xiàng)刪除后,從文檔查重緩存中刪除(如果有)
3贱呐、通過狀態(tài)的立項(xiàng)修改后丧诺,重新加載到緩存(如果有)
成果推廣
1、成果推廣通過后奄薇,添加到文檔查重緩存中
2驳阎、成果推廣刪除后,從文檔查重緩存中刪除(如果有)
3、通過狀態(tài)的成果推廣修改后呵晚,重新加載到緩存(如果有)
性能改進(jìn)點(diǎn)
為了提升用戶的體驗(yàn)蜘腌,加快文檔查重對(duì)比結(jié)果的輸出可以在如下幾點(diǎn)入手:
預(yù)先觸發(fā)
目前觸發(fā)檢查的點(diǎn)是立項(xiàng)提交時(shí)同時(shí)運(yùn)行查重的程序。一般用戶需要等待4-5秒的時(shí)間劣纲。那么逢捺,在提交之前預(yù)先觸發(fā)檢查可以減少用戶等待或者免于用戶等待。
預(yù)先觸發(fā)的方案
方案一 在立項(xiàng)的表單頁面添加“對(duì)比”按鈕癞季。
添加方式說明
在立項(xiàng)表單頁添加對(duì)比按鈕劫瞳。當(dāng)用戶填寫完項(xiàng)目論證信息后,可以點(diǎn)擊對(duì)比按鈕绷柒。那么系統(tǒng)將在后臺(tái)觸發(fā)查重檢查操作志于。
解決用戶點(diǎn)擊“對(duì)比”后再修改數(shù)據(jù)的問題
如果用戶在點(diǎn)擊完“對(duì)比”后發(fā)現(xiàn)先前填寫的數(shù)據(jù)需要修改呢?
用戶返回修改數(shù)據(jù)是無法避免的問題废睦。
如果用戶修改了項(xiàng)目論證中的數(shù)據(jù)伺绽,只能再次觸發(fā)查重。這里涉及到兩個(gè)問題:
- 如果之前的查重任務(wù)還沒有完成嗜湃,我們應(yīng)該采取什么樣的操作奈应?
- 如果多次觸發(fā)查重,是否會(huì)帶來系統(tǒng)多重任務(wù)造成性能問題购披?
解決方法
由于頁面提供了預(yù)先觸發(fā)的功能杖挣,那么重復(fù)提交查重功能是無法避免的。但是刚陡,重復(fù)提交查重請(qǐng)求不代表我們一定會(huì)執(zhí)行惩妇。由于我們后臺(tái)的查重任務(wù)是分頁抽取文檔數(shù)據(jù)執(zhí)行算法的,我們可以對(duì)同一個(gè)立項(xiàng)設(shè)置一個(gè)任務(wù)id,后面的提交請(qǐng)求執(zhí)行前可以先檢查是否正在對(duì)同一個(gè)立項(xiàng)執(zhí)行查重任務(wù)筐乳。如果有歌殃,我們可以設(shè)置下一個(gè)分頁任務(wù)不再執(zhí)行,而重新開始新的查重任務(wù)蝙云。
方案二 不添加“對(duì)比按鈕”,自動(dòng)執(zhí)行查重任務(wù)
當(dāng)用戶填寫完一個(gè)項(xiàng)目論證項(xiàng)后氓皱,自動(dòng)對(duì)該填寫觸發(fā)檢查
說明:
1、用戶在填寫項(xiàng)目論證時(shí)勃刨,每一個(gè)框填寫的文字都是比較多的波材,這意味著每一項(xiàng)的填寫都是需要花費(fèi)至少一分鐘的時(shí)間;
2朵你、基于上一點(diǎn)各聘,如果用戶填寫第一項(xiàng)時(shí),再填寫第二項(xiàng)時(shí)抡医,自動(dòng)觸發(fā)對(duì)第一項(xiàng)的查重檢查躲因,并不會(huì)影響用戶早敬,因?yàn)橛脩敉ǔT诘诙?xiàng)沒有填寫完成時(shí)第一項(xiàng)的查重結(jié)果就返回來了;
3大脉、由于項(xiàng)目論證下面還有需要用戶填寫的內(nèi)容搞监,所以當(dāng)用戶填寫完項(xiàng)目論證以后,通沉螅可以繼續(xù)正常填寫下面的內(nèi)容琐驴。所有查重結(jié)果返回后,用戶并不會(huì)感覺系統(tǒng)已經(jīng)提前完成了查重的任務(wù)秤标;
4绝淡、用戶在提交時(shí),系統(tǒng)已經(jīng)完成了所有項(xiàng)目論證的查重工作苍姜,所以用戶不會(huì)等待查重結(jié)果返回牢酵。
用戶返回修改項(xiàng)目論證的數(shù)據(jù)
與方案一一樣,用戶同樣有可能返回修改先前填寫的數(shù)據(jù)衙猪。這時(shí)解決思路是一樣的馍乙。我們可以設(shè)置一個(gè)查重任務(wù)id,當(dāng)同一個(gè)查重?cái)?shù)據(jù)到來時(shí)垫释,先前的任務(wù)如果還沒有結(jié)束丝格,可以提前讓它結(jié)束;從而開始執(zhí)行當(dāng)前查重任務(wù)棵譬。
保存對(duì)比結(jié)果
由于目前的設(shè)計(jì)不保存檢查的結(jié)果显蝌,那么當(dāng)工單進(jìn)入專家審核環(huán)節(jié)時(shí),必須再次觸發(fā)檢查茫船,這樣的檢查沒有意義琅束。保存檢查的結(jié)果可以減少查重的次數(shù)扭屁。
保存方案的設(shè)計(jì)原則
查重的數(shù)據(jù)應(yīng)該獨(dú)立于業(yè)務(wù)模塊
查重應(yīng)該是一個(gè)獨(dú)立的公用模塊
查重模塊的代碼和數(shù)據(jù)表應(yīng)獨(dú)立于業(yè)務(wù)模塊(代碼目前是獨(dú)立的模塊)
查重模塊的代碼應(yīng)該可以方便抽取成為微服務(wù)
數(shù)據(jù)表設(shè)計(jì)盡量簡(jiǎn)單算谈,避免復(fù)雜
數(shù)據(jù)表設(shè)計(jì)
查重的表是獨(dú)立的模塊,但是料滥,它還是要保存少量的業(yè)務(wù)數(shù)據(jù)然眼。比如業(yè)務(wù)id和業(yè)務(wù)類型(隨意自定義)。
字段名 | 中文名字 | 類型 | 備注 |
---|---|---|---|
id | id的值 | varchar2 | |
business_id | 業(yè)務(wù)id | varchar2 | 32位葵腹,與業(yè)務(wù)類型組成復(fù)合主鍵 |
business_type | 業(yè)務(wù)類型 | varchar2 | 自定義相應(yīng)的類型 |
hash | 哈希值 | varchar2 | 對(duì)應(yīng)內(nèi)容的哈希值高每,不需要直接保存原始內(nèi)容值,只需要保存哈希践宴,以此檢測(cè)內(nèi)容是否改變過 |
create_time | 保存時(shí)間 | date | |
state | 狀態(tài) | varchar2 | 1運(yùn)行查重中 2 查重結(jié)束 |
result_state | 是否存在可能重復(fù)的文檔 | varchar2 | 1存在 2 不存在 |
result | 查重結(jié)果 | clob | 如果觸發(fā)前檢查發(fā)現(xiàn)hash值沒有發(fā)生變化鲸匿,直接返回該字段結(jié)果 |
邏輯說明
1、業(yè)務(wù)模塊創(chuàng)建一個(gè)查重任務(wù)阻肩。
參數(shù):
業(yè)務(wù)id 業(yè)務(wù)類型 查重內(nèi)容2带欢、檢查該業(yè)務(wù)查重任務(wù)是否正在運(yùn)行
如果正在運(yùn)行运授,則提前結(jié)束該任務(wù)(禁止下一個(gè)分頁的查重,標(biāo)志必須結(jié)束任務(wù))
執(zhí)行該查重任務(wù)3乔煞、返回查重結(jié)果吁朦。查重結(jié)果可以立即顯示也可以先緩存,在需要的時(shí)候再顯示渡贾。
4逗宜、一個(gè)業(yè)務(wù)類型可能查重的觸發(fā)次數(shù)不止一次。當(dāng)下一次觸發(fā)時(shí)空骚,如果檢查hash的結(jié)果與先前一致纺讲,不必觸發(fā)查重任務(wù),只需要返回先前查重的結(jié)果囤屹。
改進(jìn)運(yùn)行節(jié)點(diǎn)
由于查重算法比較耗系統(tǒng)的資源刻诊,可以將查重任務(wù)轉(zhuǎn)移到其他模塊獨(dú)立運(yùn)行:
轉(zhuǎn)換到BPP模塊。
設(shè)置獨(dú)立的微服務(wù)模塊牺丙。并多節(jié)點(diǎn)運(yùn)行则涯。這個(gè)方案受限于系統(tǒng)的硬件資源情況。
多節(jié)點(diǎn)運(yùn)行
多節(jié)點(diǎn)可以將查重的數(shù)據(jù)量N倍減少冲簿∷谂校可以大大提升效率,但對(duì)資源比較敏感峦剔。由于正式環(huán)境節(jié)點(diǎn)數(shù)量和開發(fā)難度的問題档礁,目前這個(gè)方案可以作為備選方案。
多節(jié)點(diǎn)運(yùn)行方案(草稿)
1吝沫、接到任務(wù)的節(jié)點(diǎn)成為查重任務(wù)的管理者和協(xié)調(diào)者(NameNode)
2呻澜、管理者根據(jù)文檔總數(shù)量確定各節(jié)點(diǎn)任務(wù),向各節(jié)點(diǎn)(taskNode,也可以是它自身)發(fā)送任務(wù)
3惨险、任務(wù)的參數(shù)為查重的內(nèi)容和分頁的游標(biāo)羹幸,文檔數(shù)量
4、NameNode等待各節(jié)點(diǎn)返回各自的查重結(jié)果
5辫愉、所有taskNode返回查重結(jié)果后栅受,NameNode合并結(jié)果,排序恭朗,生成最后結(jié)果
6屏镊、任何一個(gè)節(jié)點(diǎn)運(yùn)行出錯(cuò)或者沒有返回,該查重任務(wù)失敗痰腮。(沒有必要設(shè)計(jì)復(fù)雜的容錯(cuò)能力)
延時(shí)處理
性能改進(jìn)的另一種思路是使用消息隊(duì)列延時(shí)處理查重任務(wù)而芥。但目前系統(tǒng)要求查重不能延時(shí)處理,因此這個(gè)方案可以作為備選膀值。
延時(shí)處理概念方案
1棍丐、確定延時(shí)通知方案(短信弟翘、站內(nèi)信、其他通知手段)
2骄酗、設(shè)計(jì)延時(shí)提交方案稀余。(可以設(shè)置工單必須等待查重任務(wù)結(jié)束后才可以實(shí)質(zhì)提交(系統(tǒng)自動(dòng)提交),如果有重復(fù)內(nèi)容趋翻,需要用戶手動(dòng)確認(rèn))