Spring 数据 MongoDB 反应式 - 处理大量文档的 findAll?
Spring Data MongoDB Reactive - Dealing with findAll for a large number of documents?
假设我有一个 ReactiveMongoRepository
定义如下:
@Repository
interface MyRepo extends ReactiveMongoRepository<MyDTO, String> {}
鉴于存储库包含大量 MyData
文档(至少数十万个)并且您执行简单的 "findAll()" 然后删除:
myRepo.findAll()
.doOnNext( myDto -> {
System.out.println(myDto.message);
})
.flatMap( myDto -> {
myRepo.deleteById(myDto.id);
})
这将大约每月执行一次。
在流式传输大量数据时,像这样使用 Spring 数据/MongoDB 安全吗?还是建议使用某种批处理或分页来避免游标问题等?
一般的答案是视情况而定,但在我看来你的具体情况是否定的,至少不是以你提出的方式
首先,我猜一个find all操作,for all collection意义不大。
我想找到一个需要处理数十万的用例几乎是不可能的,假设你已经实现了一个数据摄取管道,你已经处理了无限的数据流,但是对于这个用例,我可以建议一个更合适的例如使用 spring 云流与 kafka 流式传输的体系结构。
问题不在于处理大量数据的可能性,因为 mongo 反应式驱动器的性能非常好,调整背压机制你应该保存你的服务器,但在流中重复使用查找所有数据,所以大的很少适用,如果您应该处理数据流,带有 spring 云流的消息传递中间件可能是最好的选择,想象一下您的 find 一切正常,您的服务器和 mogno 可能会很好,但您的用户将参加很多小时在请求完成之前,否则如果用例是如前所述的在线过程,则可以处理无限数据流 spring 云流可能是最佳选择
更新
考虑到应该每月 运行 一次的批处理用例,我可以说音乐变化很大。
正在阅读 Spring 数据反应的代码 mongo 我看到了:
@NoRepositoryBean
public interface ReactiveMongoRepository<T, ID> extends ReactiveSortingRepository<T, ID>, ReactiveQueryByExampleExecutor<T> {
....
}
而不是
@NoRepositoryBean
public interface MongoRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
...
}
这里需要注意的是reactive版本的repository是没有分页功能的,其实base interface的名字里也没有Paging这个词,这里的重点是技术的种类。
在阻塞 io 中,分页对于每个请求一个线程的模型是必要的,因此阻塞模式对于数据库应用程序是危险的,因此连接繁忙,并且所有查询的客户端对于超时、加载和依此类推,在页面中拆分查询可以帮助避免对系统造成太大压力。但是在无阻塞io中,你附加到数据流的行为是不同的,驱动程序是一个无阻塞驱动程序,你不使用经典的mongo驱动程序,spring数据使用特定的反应mongo 针对此作业优化的驱动器,它基于事件循环模型。
说这里的重点是离线专业使用io密集型模型可能不是那么有用而不是安全,我的意思是使用反应模型对于主要是io绑定且具有高要求的软件很有用流量,模型支持高并发。但是,如果您的用例是每月一次的干净集合,我想使用反应式编程可能是安全的,因为这被认为是支持 io 密集型用例,但在这种情况下,带有分页的经典批处理阻塞 io 模型是更合适的方法。关键是我认为驱动程序在高流用例中管理大量数据应该是安全的,但是将这种方法用于批处理用例是无用的
希望对你有所帮助
假设我有一个 ReactiveMongoRepository
定义如下:
@Repository
interface MyRepo extends ReactiveMongoRepository<MyDTO, String> {}
鉴于存储库包含大量 MyData
文档(至少数十万个)并且您执行简单的 "findAll()" 然后删除:
myRepo.findAll()
.doOnNext( myDto -> {
System.out.println(myDto.message);
})
.flatMap( myDto -> {
myRepo.deleteById(myDto.id);
})
这将大约每月执行一次。
在流式传输大量数据时,像这样使用 Spring 数据/MongoDB 安全吗?还是建议使用某种批处理或分页来避免游标问题等?
一般的答案是视情况而定,但在我看来你的具体情况是否定的,至少不是以你提出的方式
首先,我猜一个find all操作,for all collection意义不大。 我想找到一个需要处理数十万的用例几乎是不可能的,假设你已经实现了一个数据摄取管道,你已经处理了无限的数据流,但是对于这个用例,我可以建议一个更合适的例如使用 spring 云流与 kafka 流式传输的体系结构。
问题不在于处理大量数据的可能性,因为 mongo 反应式驱动器的性能非常好,调整背压机制你应该保存你的服务器,但在流中重复使用查找所有数据,所以大的很少适用,如果您应该处理数据流,带有 spring 云流的消息传递中间件可能是最好的选择,想象一下您的 find 一切正常,您的服务器和 mogno 可能会很好,但您的用户将参加很多小时在请求完成之前,否则如果用例是如前所述的在线过程,则可以处理无限数据流 spring 云流可能是最佳选择
更新
考虑到应该每月 运行 一次的批处理用例,我可以说音乐变化很大。
正在阅读 Spring 数据反应的代码 mongo 我看到了:
@NoRepositoryBean
public interface ReactiveMongoRepository<T, ID> extends ReactiveSortingRepository<T, ID>, ReactiveQueryByExampleExecutor<T> {
....
}
而不是
@NoRepositoryBean
public interface MongoRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
...
}
这里需要注意的是reactive版本的repository是没有分页功能的,其实base interface的名字里也没有Paging这个词,这里的重点是技术的种类。
在阻塞 io 中,分页对于每个请求一个线程的模型是必要的,因此阻塞模式对于数据库应用程序是危险的,因此连接繁忙,并且所有查询的客户端对于超时、加载和依此类推,在页面中拆分查询可以帮助避免对系统造成太大压力。但是在无阻塞io中,你附加到数据流的行为是不同的,驱动程序是一个无阻塞驱动程序,你不使用经典的mongo驱动程序,spring数据使用特定的反应mongo 针对此作业优化的驱动器,它基于事件循环模型。
说这里的重点是离线专业使用io密集型模型可能不是那么有用而不是安全,我的意思是使用反应模型对于主要是io绑定且具有高要求的软件很有用流量,模型支持高并发。但是,如果您的用例是每月一次的干净集合,我想使用反应式编程可能是安全的,因为这被认为是支持 io 密集型用例,但在这种情况下,带有分页的经典批处理阻塞 io 模型是更合适的方法。关键是我认为驱动程序在高流用例中管理大量数据应该是安全的,但是将这种方法用于批处理用例是无用的
希望对你有所帮助