Spring Data MongoDB Reactive - 处理大量文档的 findAll?

标签 spring spring-data spring-data-mongodb project-reactor

假设我有一个像这样定义的 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 Data/MongoDB 安全吗?或者是否建议使用某种批处理或分页以避免光标问题等?

最佳答案

一般答案是这取决于,但在你的具体情况下,我认为是否定的,至少不是以你提出的方式

首先,我猜想对于所有集合来说,查找所有操作没有什么意义。 我认为找到一个需要处理数十万个用例的用例几乎是不可能的,假设您已经实现了一个数据摄取管道,那么您已经处理了无限的数据流,但是对于这个用例,我可以建议一个更合适的用例例如,使用 Spring Cloud Stream 与 kafka 进行流式传输的架构。

问题不在于处理许多数据的可能性,因为 mongo react 驱动器性能非常好,并且调整背压机制,您应该保存服务器,但重复使用流中的查找全部,如此大的数据几乎不适用,可能如果您应该这样做处理数据流,使用 Spring Cloud Stream 的消息传递中间件可能是最好的选择,想象一下,您触发了一个发现一切正常的服务器,而 Mogno 可能会很好,但您的用户将在请求完成之前花费几个小时,否则如果使用如前所述,案例是一个在线流程,可以处理无限数据流,Spring Cloud Stream 可能是最好的选择

更新

考虑到应该每月运行一次的批处理的用例,我可以说音乐变化很大。

阅读 Spring data reactive 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)版本的存储库不具备分页功能,实际上基础接口(interface)的名称中不包含 Paging 一词,这里的重点是技术的种类。

在阻塞 io 中,分页对于每个请求一个线程的模型是必要的,因此阻塞模式对于数据库应用程序来说是危险的,因此繁忙的连接和所有查询的客户端对于超时、负载等都是危险的并且将查询拆分在页面中可以帮助不给系统带来太大压力。但是在无阻塞io中,行为是不同的,您附加到数据流,驱动程序是无阻塞驱动程序,您不使用经典的mongo驱动程序,spring data使用针对此作业优化的特定响应式(Reactive)mongo驱动程序,并且它基于事件循环模型。

说这里的关键点是,对于离线专业使用 io 密集型模型可能不是那么有用而不是安全,我的意思是使用响应式(Reactive)模型对于主要是 io 绑定(bind)且流量高的软件很有用,该模型支持高并发。但是,如果您的用例是每月一次的干净集合,我想使用响应式(Reactive)编程可能是安全的,因为这被认为是支持 io 密集型用例,但在这种情况下,带有分页的经典批量阻塞 io 模型是一种更合适的方法。关键点是我认为驱动程序在高流用例中管理大量数据应该是安全的,但对于批处理用例使用这种方法是没有用的

希望对你有帮助

关于Spring Data MongoDB Reactive - 处理大量文档的 findAll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54368627/

相关文章:

spring-security - Spring Data JPA 和 spring-security : filter on database level (especially for paging)

java - Spring 4.1.4 和 Jackson 2.5,注释驱动设置不将 REST 响应转换为 JSON

javascript - 清除间隔()不工作

java - 具有角色的经过身份验证的用户的 Spring Security Java 配置

mongodb - MongoCursor<Document> 与 FindIterable<Document> 之间的区别

mongodb - Spring数据按 "_class "值查找

mongodb - "now"和给定日期之间的差异

spring - 在 dao 单元测试之前生成数据库表

java - Spring Data 规范 - 带 join 的 RSQL

java - 使用 Spring Data ElasticSearch 进行全文搜索