[英]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.