我正在开发一个 Minecraft 网络,该网络有多个服务器操作“用户对象”,这只是一个 Mongo 文档。用户对象修改后需要立即写入数据库,否则可能会在其他服务器(具有较旧版本的用户对象)中被覆盖,但有时需要在短时间内写掉数百个对象时间..(几秒钟内)。我的问题是:如何轻松地将对象写入 MongoDB 数据库而不会使数据库真正过载。
我一直在想一个想法,但我不知道它是否相关: - 在另一个线程中创建某种队列,每次需要将数据对象保存到数据库中时,它都会进入队列,然后在“队列线程”中,对象将以某种间隔一一保存。
提前致谢
顺便说一句,我使用 Morphia 作为 Java 框架
最佳答案
“几秒钟内数百个物体[...]”听起来并不算多。你现在能做多少?
对于写入操作速度最重要的设置是 WriteConcern 。您目前使用什么?这是否适合您的项目(数据安全与速度)?
如果您需要一次执行多个写入操作,您可能可以通过批量操作来加快速度。它们已添加到 MongoDB 2.6 中,Morphia 也支持它们 — 请参阅此 unit test .
我会对队列非常谨慎:
- 你真的需要它吗?根据您的硬件和配置,您应该能够每秒执行数百甚至数千次写入操作。
- 异步真的是最适合您的方法吗?写操作/消息的生产者只能假设他的更改已被应用,但它可能尚未应用,并且仍在队列中等待写入。这是预期的行为吗?
- 它会让您的生活更轻松吗?您需要了解另一个软件,它会增加许多新的且最有可能无法预见的问题。
- 如果您需要扩展写入,为什么不使用分片?无需额外的技术,您的代码在使用和不使用它的情况下都会表现相同。
您可能需要阅读以下博客文章,了解为什么您可能希望避免此类操作的队列:http://widgetsandshit.com/teddziuba/2011/02/the-case-against-queues.html
关于java - 将数百个数据对象写入 Mongo 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26481826/