第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

MongoDB + Redis 任務(wù)隊(duì)列性能瓶頸

MongoDB + Redis 任務(wù)隊(duì)列性能瓶頸

千萬里不及你 2019-04-08 11:16:51
問題背景:近期在重構(gòu)公司內(nèi)部一個(gè)重要的任務(wù)系統(tǒng),由于原來的任務(wù)系統(tǒng)使用了MongoDB來保存任務(wù),客戶端從MongoDB來取,至于為什么用MongoDB,是一個(gè)歷史問題,也是因?yàn)槿绻褂玫組ongoDB的數(shù)組查詢可以減少任務(wù)數(shù)量很多次,假設(shè)這樣的情況,一個(gè)md5需要針對(duì)N種情況做任務(wù)處理,如果用到MongoDB的數(shù)組,只需要將一個(gè)md5作為一條任務(wù),其中包含一個(gè)長(zhǎng)度為N的待處理任務(wù)列表(只有N個(gè)子任務(wù)都處理完后整個(gè)任務(wù)才算處理完畢),這樣整個(gè)任務(wù)系統(tǒng)的數(shù)量級(jí)就變?yōu)樵瓉淼?/N。細(xì)節(jié)描述:1.當(dāng)MongoDB的任務(wù)數(shù)量增多的時(shí)候,數(shù)組查詢相當(dāng)?shù)穆?,任?wù)數(shù)達(dá)到5K就已經(jīng)不能容忍了。2.任務(wù)處理每個(gè)md5對(duì)應(yīng)的N個(gè)子任務(wù)必須要全部完成才從MongoDB中刪除3.任務(wù)在超時(shí)后可以重置改進(jìn)方案如下:由于原有代碼的耦合,不能完全拋棄MongoDB,所以決定加一個(gè)Redis緩存。一個(gè)md5對(duì)應(yīng)的N個(gè)子任務(wù)分發(fā)到N個(gè)Redis隊(duì)列中(拆分子任務(wù))。一個(gè)單獨(dú)的進(jìn)程從MongoDB中向Redis中將任務(wù)同步,客戶端不再?gòu)腗ongoDB取任務(wù)。這樣做的好處是拋棄了原有的MongoDB的數(shù)組查詢,同步進(jìn)程從MongoDB中取任務(wù)是按照任務(wù)的優(yōu)先級(jí)偏移(已做索引)來取,所以速度比數(shù)組查詢要快。這樣客戶端向Redis的N個(gè)隊(duì)列中取子任務(wù),把任務(wù)結(jié)果返回原來的MongoDB任務(wù)記錄中(根據(jù)md5返回子任務(wù))。改進(jìn)過程遇到的問題:由于客戶端向MongoDB返回時(shí)候會(huì)有一個(gè)update操作,如果N個(gè)子任務(wù)都完成,就將任務(wù)從MongoDB中刪除。這樣的一個(gè)問題就是,經(jīng)過測(cè)試后發(fā)現(xiàn)MongoDB在高并發(fā)寫的情況下性能很低下,整個(gè)任務(wù)系統(tǒng)任務(wù)處理速度最大為200/s(16核,16G,CentOS,內(nèi)核2.6.32-358.6.3.el6.x86_64),原因大致為在頻繁寫情況下,MongoDB的性能會(huì)由于鎖表操作急劇下降。具體問題:(ThinkoutoftheBox)能否提出一個(gè)好的解決方案,能夠保存任務(wù)狀態(tài)(子任務(wù)狀態(tài)),速度至少超過MongoDB的?
查看完整描述

2 回答

?
米脂

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊

初步的思考了一下,僅供參考:
首先,提一下索引,相信這個(gè)你應(yīng)該加了索引。
有個(gè)問題確認(rèn)一下,mongodb最新版本中的鎖粒度還是Database級(jí)別吧,不知道你用的哪個(gè)版本,還沒到鎖表(Collection)這個(gè)粒度,所以寫并發(fā)大的情況下比較糟糕,不過應(yīng)該性能也不至于糟到像你描述的那樣???不解,建議考慮任務(wù)分庫的可能性?
能否考慮把子任務(wù)的狀態(tài)和主任務(wù)的狀態(tài)分開保存。子任務(wù)的狀態(tài),可以放到redis,主任務(wù)只負(fù)責(zé)自己本身的狀態(tài),這樣每個(gè)主任務(wù)更新頻率降為1/N,可大大減少mongodb中主任務(wù)表的壓力。
子任務(wù)完成或超時(shí)后,可否考慮后臺(tái)異步單線程順序同步mongodb的主任務(wù)狀態(tài)?
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-08
?
犯罪嫌疑人X

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊

個(gè)人認(rèn)為題主提到的MongoDB數(shù)組查詢和更新的性能問題,很可能是Schema設(shè)計(jì)上的問題。但題主并沒有給出具體的設(shè)計(jì),所以我就提出幾個(gè)值得關(guān)注的點(diǎn)僅供參考:
索引,正如樓上所說,你應(yīng)該已經(jīng)為數(shù)組加上了索引。但是值得注意的是,數(shù)組字段的索引比普通字段的索引體積要大很多(具體取決于數(shù)組的大小,數(shù)組越大,索引所占的空間越大)。這樣就可能會(huì)導(dǎo)致一個(gè)問題:索引并不(完全)在內(nèi)存里!后果是,每次查詢都需要涉及到額外的IO操作,性能會(huì)急劇下降。
查詢返回文檔的大小。如果每次返回查詢的文檔數(shù)據(jù)量較大,而且客戶端與mongodb并不處于同一機(jī)器上,那就會(huì)增加了網(wǎng)絡(luò)傳輸所需的時(shí)間(不要小看這點(diǎn)時(shí)間),所以盡可能只返回所需要的字段。
update-in-place.由于schemaless的特性,mongodb會(huì)為每條文檔記錄預(yù)留一些空間給增加額外的字段或數(shù)據(jù)時(shí)使用,提高update的性能。但如果你文檔的大小頻繁地?cái)U(kuò)展(增加字段,增加數(shù)組長(zhǎng)度等),那就會(huì)導(dǎo)致寫的性能問題:mongodb需要把增長(zhǎng)了的文檔移動(dòng)(move)到別的地方。(相當(dāng)于從硬盤的一個(gè)位置移動(dòng)另一個(gè)更空閑的位置)這時(shí)候的性能會(huì)大大下降。
mongodb是一個(gè)內(nèi)存型的數(shù)據(jù)庫,如果你的熱點(diǎn)數(shù)據(jù)都在內(nèi)存上,它的性能會(huì)非常優(yōu)異,而這很大程度取決與你的Schema設(shè)計(jì)。
PS:mongodb一直標(biāo)榜的Schemaless優(yōu)點(diǎn)誤導(dǎo)了很多人,其實(shí)這個(gè)更多是想說明mongodb是動(dòng)態(tài)的schema,而并不是不需要設(shè)計(jì)schema。
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-08
  • 2 回答
  • 0 關(guān)注
  • 298 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)