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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

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

2 回答

?
慕哥6287543

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個贊

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

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個贊

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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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