[英]Best practices for logging real-time data into a NoSQL DB
我有一個 Java Web 應用程序,它接收一些實時事件並將它們推送到用戶界面層。 我想記錄所有感知到的事件,由於信息量很大,我更喜歡使用 NoSQL 數據庫。
為此,我設置了一個 mongodb,它為每個事件插入一個文檔。 問題是這種方法(每個事件一個磁盤訪問)顯着減慢了整個過程。
那么,在這種情況下我可以采取什么方法呢? mongodb 中有哪些可用的選項(例如批量插入、異步插入、緩存等)? 切換到其他一些 NoSQL 數據庫實現會有所作為嗎? 這里的最佳做法是什么?
我已經等了一段時間才能看到其他答案,但失去了耐心。 我已經使用 MongoDB 作為 3 個項目的日志存儲(兩個用於 Java,一個用於 C#)。 基於此,我可以找出以下重要規則來組織日志記錄:
不要使用索引。 如果您主要編寫,那么索引會導致性能下降。 如果您需要后處理日志分析,請將信息復制到另一個數據庫或集合。 不幸的是,您無法擺脫主鍵_id
- 保持原樣(GUID)或替換為自動遞增NumberLong
。
降低寫關注度。 MongoDB 有豐富的選項來控制寫操作的感知。 您可以設置 LogLevel 和寫入規則之間的匹配。 例如DEBUG
、 INFO
、 WARN
可以與WriteConcern.UNACKNOWLEDGED和ERROR
一起使用, FATAL
可以與WriteConcern.ACKNOWLEDGED一起存儲。 通過這種方式,您可以通過避免在低優先級消息寫入期間暫停來提高應用程序性能。 同時您確定重要的消息(很少)被放置到存儲中。
緩存你的集合實例。 我的意思是避免每次消息到達時通過getDB
或getCollection
解析 Mongo 的對象。
減少網絡傳遞的數據量。 通過最少的字段集限制您的消息。 截斷太長的堆棧跟蹤。 看看 Spring 3.x 如何縮短類swsmmaRequestMappingHandlerMapping
全名而不是some.whatever.sub.main.minimal.agent.RequestMappingHandlerMapping
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.