使用 Spring Webflux 对响应应用分页会使其阻塞吗?

Does applying Pagination on response using Spring Webflux make it blocking?

下面的代码是否会阻塞调用,如果是,我如何使其成为非阻塞的?即使 Reactive Java Stream 无用?如何在不阻塞调用的情况下进行分页?

目前我有一个 webClient 调用 return 一个 Flux<Item> 的后端服务,根据规范我需要 return 一个 ResponseEntity<ItemListResponse> 我提供了一个分页响应

控制器方法中的代码如下所示 ->

// getItems method was initially returning a Flux but my method was failing to paginate it so now that method returns a Mono<List<Item>>
// I would really like to see how I can make this work with Flux!
return webClient.getItems(...required params...)
           .map(r -> {
              // we get offset and limit from query params
              var paginatedItems = listPaginator.applyPagination(r, offset, limit)
              // assembleItemResponse method maps all values from backend service to new response required by client
              List<ItemResponse> itemResponseList = paginatedItems.stream()
                       .map(this::assembleItemResponse)
                       .collect(Collectors.toList());

              return ResponseEntity.ok()
                         .body(ItemListResponse.builder()
                                 .itemCount(r.size())
                                 .pagesize(itemResponseList.size())
                                 .listItems(itemResponseList)
                                 .build());
              });

Does applying Pagination on response using Spring Webflux make it blocking?

关于分页,本质上 没有任何阻塞,但是正常的 Spring 数据实现方法是使用 PagingAndSortingRepository 查询数据层只有该特定页面所需的结果(而不是查询数据层以获取所有可能的结果然后进行过滤,这可能会对性能产生巨大影响,具体取决于数据大小。)不幸的是,这种方法 is 阻塞。 PagingAndSortingRepository 目前还没有对应的反应式。

但是,这似乎不是您在这里所做的。此处的完整示例会有所帮助,但看起来 r 是一个项目列表,然后您将 listPaginator 应用于整个列表以减少它。如果是这样,那么就没有理由 必然 阻塞,所以它应该是安全的。但是,如果不了解 applyPaginationassembleItemResponse 方法的具体行为,就无法确定。如果这些方法是阻塞的,那么不——你在这里不安全,你需要考虑另一种方法(究竟哪种方法需要一个更完整的例子。)如果这些方法是非阻塞的(它们只处理它们拥有的数据, 不要调用任何进一步的 web / db 服务等) 然后你就可以了。

另外,您可以考虑查看 Blockhound,它将能够确定地告诉您是否有任何不应该出现的阻塞调用。