2016-04-27 66 views
6

我有一個Java Web應用程序,它接收一些實時事件並將它們推送到用戶界面層。我想記錄所有感知的事件,並且因爲信息量會很大,所以我更喜歡使用NoSQL db。將實時數據記錄到NoSQL DB中的最佳實踐

我爲此設置了一個mongodb,它爲每個事件插入一個文檔。問題在於,這種方法(每個事件的磁盤訪問)會顯着降低整個過程的速度。

那麼,在這種情況下我可以採取哪些方法? mongodb有哪些選項可供選擇(例如批量插入,異步插入,緩存......)?切換到其他一些NoSQL數據庫實現有什麼不同?這裏有什麼最佳實踐?

+1

這將是很好的瞭解預期的性能限制的更多細節。你期望有多大的吞吐量? 100/S? 10K/S? 1M/s的?平均和可能的高峯?序列化時事件的大小是多少? 100字節? 1兆字節?你是否需要很少回顧過去的事件,可能是爲了給定的時間窗口重播它們,或者你需要對它們做臨時查詢?您需要多長時間存儲它們 - 數據庫的分辨率是否會增長到數年,或者您可以每週對二級存儲進行一些清理/歸檔? –

回答

3

我已經等了一段時間才能看到其他答案,但是失去耐心。我已經使用MongoDB作爲3個項目的日誌存儲(兩個用於Java,一個用於C#)。基於此,我可以計算出以下重要規則來組織日誌記錄:

  1. 請勿使用索引。如果您主要編寫索引,則會導致性能下降。如果您需要後處理日誌分析信息複製到另一個數據庫或集合。不幸的是,你不能擺脫主鍵_id - 只是保持原樣(GUID)或自動增量NumberLong

  2. 較低的寫入關注度。 MongoDB擁有豐富的選項來控制寫入操作的意識。您可以在LogLevel和寫入規則之間設置匹配。例如DEBUG,INFO,WARN可以用WriteConcern.UNACKNOWLEDGEDERROR,FATAL可以用WriteConcern.ACKNOWLEDGED存儲。通過避免在低優先級消息編寫期間暫停,可以提高應用程序性能。同時,您確定重要的信息(很少)存儲。

  3. 緩存你的收集實例。我的意思是避免每次消息到達時通過getDBgetCollection解決Mongo的對象。

  4. 縮小網絡傳遞的數據量。用最少的一組字段來限制你的消息。截斷太長的堆棧跟蹤。看春3.X如何縮短s.w.s.m.m.a.RequestMappingHandlerMapping類的全名,而不是some.whatever.sub.main.minimal.agent.RequestMappingHandlerMapping