将实时数据记录到NoSQL DB的最佳实践

时间:2016-04-27 07:54:24

标签: java mongodb performance logging real-time

我有一个Java Web应用程序,它接收一些实时事件并将它们推送到用户界面层。我想记录所有感知事件,因为信息量很大,我更喜欢使用NoSQL数据库。

我为此设置了一个mongodb,它为每个事件插入一个文档。问题是这种方法(每个事件的磁盘访问)大大减慢了整个过程。

那么,在这种情况下我可以采取什么方法? mongodb中有哪些选项(例如批量插入,异步插入,缓存......)?会切换到其他一些NoSQL数据库实现有所作为吗?这里最好的做法是什么?

1 个答案:

答案 0 :(得分:3)

我等了一段时间才能看到其他答案,但却失去了耐心。我使用MongoDB作为3个项目的日志存储(两个用于Java,一个用于C#)。基于此,我可以找出以下重要规则来组织日志记录:

  1. 不要使用索引。如果你主要写,那么索引会导致性能下降。如果需要后处理日志分析,请将信息复制到另一个数据库或集合。很遗憾,您无法摆脱主键_id - 只需保留原样(GUID)或替换为自动增量NumberLong

  2. 降低写入问题。 MongoDB具有丰富的选项来控制写操作的意识。您可以在LogLevel和写入规则之间设置匹配。例如,DEBUGINFOWARN可以与WriteConcern.UNACKNOWLEDGEDERROR一起使用,FATAL可以与WriteConcern.ACKNOWLEDGED一起存储。通过避免在低优先级消息写入期间暂停来提高应用程序性能。同时您确定将重要消息(很少)放到存储中。

  3. 缓存集合实例。我的意思是每当消息到达时,避免在getDBgetCollection上解析Mongo的对象。

  4. 缩小网络传递的数据量。通过最少的字段集限制您的消息。截断太长的堆栈跟踪。看看Spring 3.x如何缩短班级s.w.s.m.m.a.RequestMappingHandlerMapping的全名,而不是some.whatever.sub.main.minimal.agent.RequestMappingHandlerMapping