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

时间:2019-01-25 15:47:31

标签: 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安全吗?还是建议使用某种批处理或分页来避免光标问题等?

1 个答案:

答案 0 :(得分:1)

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

首先,我想对所有集合进行查找所有操作几乎没有意义。 我想找到一个需要处理成千上万个用例的情况几乎是不可能的,假设您已经实现了数据提取管道,那么您可以处理无限量的数据流,但是对于这种用例,我可以建议一个更合适的方法架构,例如使用Spring Cloud Streaming与Kafka进行流传输。

问题不在于处理许多数据的可能性,因为mongo反应式驱动器性能非常好,并且调整背压机制应该保存服务器,但是重复使用流中的全部查找功能几乎不适用,可能如果您应该处理数据流时,带有Spring Cloud Streaming的消息传递中间件可能是最好的选择,对服务器进行映像查找就可以了,Mogno可能会很好,但是您的用户将在请求完成前花费很多时间,否则,如果使用如前所述,这种情况是一种行处理,用于处理无限数据流,弹簧云流可能是最好的选择

更新

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

阅读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> {
...
}

这里要注意的重点是,响应式版本的存储库不具有分页功能,实际上基本接口的名称不包含“分页”一词,这里的重点是这种技术。

在阻塞io中,该模型对于每请求一个线程来说是必需的分页,因此阻塞模式对于数据库应用程序是危险的,因此在繁忙的连接中,所有查询的客户端对于超时,负载等都是危险的而将查询拆分为页面可以帮助减轻系统负担。但是在无阻塞io中,您将数据附加到数据流上的行为有所不同,该驱动程序是无阻塞驱动程序,您没有使用经典mongo驱动程序,spring数据使用了针对此作业优化的特定反应式mongo驱动器,它基于事件循环模型。

说,这里的重点是,对于离线的报告使用io密集型模型可能不是那么有用,而不是安全,我的意思是说,使用反应式模型对于主要受io约束和高流量的软件很有用,该模型支持高并发性。但是,如果您的用例是一个月一次的干净集合,我想可能使用反应式编程是安全的,因为这被认为可以支持密集型用例,但在这种情况下,采用分页的经典批处理io模型是更合适的方法。关键点是我认为驱动程序应该足够安全,可以在高流量和高流量的用例中管理大量数据,但是对于批处理用例而言,将这种方法用处不大了

我希望它可以为您提供帮助