亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

MongoDB + Redis 任務隊列性能瓶頸

MongoDB + Redis 任務隊列性能瓶頸

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

2 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

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

TA貢獻2080條經驗 獲得超4個贊

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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號