代码之家  ›  专栏  ›  技术社区  ›  Johan

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

  •  3
  • Johan  · 技术社区  · 7 年前

    假设我有一个 ReactiveMongoRepository 定义如下:

    @Repository
    interface MyRepo extends ReactiveMongoRepository<MyDTO, String> {}
    

    考虑到存储库包含大量 MyData

    myRepo.findAll()
          .doOnNext( myDto -> {
                System.out.println(myDto.message);
          })
          .flatMap( myDto -> {
                myRepo.deleteById(myDto.id);
          })
    

    这将大约每月执行一次。

    在流式传输大数据集时,这样使用Spring Data/MongoDB安全吗?还是建议使用某种批处理或分页来避免光标问题等?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Valerio Vaudi    7 年前

    一般的答案是这要看情况而定,但在你的具体情况下,我认为是不,至少不是以你目前的方式

    首先,我猜findall操作,for all集合没有什么意义。

    问题不在于处理大量数据的可能性,因为mongo反应式驱动器的性能非常好,而且调整背压机制应该可以保存服务器,但重复使用find all in streaming(在流媒体中查找所有数据),因此很少适用,如果你应该处理数据流,那么使用spring cloud stream的消息中间件可能是最好的选择,想象一下你在你的服务器和mogno上启动find all ok可能会很好,但你的用户会在请求完成前的很多小时出席,否则,如果用例是如前面所说的用于处理无限数据流的行处理,那么spring-cloud-stream可能是最好的选择

    使现代化

    @NoRepositoryBean
    public interface ReactiveMongoRepository<T, ID> extends ReactiveSortingRepository<T, ID>, ReactiveQueryByExampleExecutor<T> {
    ....
    }
    

    而不是

    @NoRepositoryBean
    public interface MongoRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    ...
    }
    

    这里需要注意的关键点是,存储库的被动版本没有分页功能,事实上,基本接口的名称不包含Paging这个词,这里的关键点是这种技术。

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