簡體   English   中英

將實時數據記錄到 NoSQL DB 的最佳實踐

[英]Best practices for logging real-time data into a NoSQL DB

我有一個 Java Web 應用程序,它接收一些實時事件並將它們推送到用戶界面層。 我想記錄所有感知到的事件,由於信息量很大,我更喜歡使用 NoSQL 數據庫。

為此,我設置了一個 mongodb,它為每個事件插入一個文檔。 問題是這種方法(每個事件一個磁盤訪問)顯着減慢了整個過程。

那么,在這種情況下我可以采取什么方法呢? mongodb 中有哪些可用的選項(例如批量插入、異步插入、緩存等)? 切換到其他一些 NoSQL 數據庫實現會有所作為嗎? 這里的最佳做法是什么?

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

  1. 不要使用索引。 如果您主要編寫,那么索引會導致性能下降。 如果您需要后處理日志分析,請將信息復制到另一個數據庫或集合。 不幸的是,您無法擺脫主鍵_id - 保持原樣(GUID)或替換為自動遞增NumberLong

  2. 降低寫關注度。 MongoDB 有豐富的選項來控制寫操作的感知。 您可以設置 LogLevel 和寫入規則之間的匹配。 例如DEBUGINFOWARN可以與WriteConcern.UNACKNOWLEDGEDERROR一起使用, FATAL可以與WriteConcern.ACKNOWLEDGED一起存儲。 通過這種方式,您可以通過避免在低優先級消息寫入期間暫停來提高應用程序性能。 同時您確定重要的消息(很少)被放置到存儲中。

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

  4. 減少網絡傳遞的數據量。 通過最少的字段集限制您的消息。 截斷太長的堆棧跟蹤。 看看 Spring 3.x 如何縮短類swsmmaRequestMappingHandlerMapping全名而不是some.whatever.sub.main.minimal.agent.RequestMappingHandlerMapping

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM