繁体   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