Почему вложенная плоская карта выполняется намного дольше, чем то же самое без вложенности

#java #project-reactor #spring-webclient

#java #проект-реактор #spring-webclient

Вопрос:

Я использую WebClient от WebFlux для получения данных из удаленного Api.

Здесь около 1000 пользователей, у каждого из них несколько постов, к каждому посту есть несколько комментариев.

Вот конечные точки с соответствующими методами:

 GET /users
GET /users/{userId}/posts/{postId}/comments
 
 Flux<User> getUsers() {
  return client
      .get()
      .uri("/users")
      .retrieve()
      .bodyToMono(UserResponse.class)
      .flatMapIterable(UserResponse::getData);
}

Mono<Comment> getComments(Long userId, Long postId) {
  return client
      .get()
      .uri("/users/{userId}/posts/{postId}/comments", userId, postId)
      .retrieve()
      .bodyToMono(CommentResponse.class)
      .map(CommentResponse::getData);
}
 

Просто интересно, почему execute2() выполняется в ~ 2 раза дольше, чем первый? Разве они не должны быть одинаковыми, или я что-то упускаю?

Потому что с вложенными плоскими картами я могу получить все данные, необходимые в конце выполнения, но с первой я должен использовать кортежи для передачи данных через все операторы.

 void execute1() {
  getUsers()
      .flatMap(user -> Flux.fromIterable(user.getPosts())
          .map(post -> Tuples.of(user, post)))
      .flatMap(tuple2 -> getComments(tuple2.getT1().getId(), tuple2.getT2().getId())
          .map(comment -> Tuples.of(tuple2.getT1(), tuple2.getT2(), comment)))
      .collectList()
      .block();
}

void execute2() {
  getUsers()
      .flatMap(user ->
          Flux.fromIterable(user.getPosts())
              .flatMap(post ->
                  getComments(user.getId(), post.getId())
                      .map(comment -> Tuples.of(user, post, comment))))
      .collectList()
      .block();
}
 

Объект ответа:

 @Data
class UserResponse {
  private List<User> data;
}

@Data
class User {
  private long id;
  private List<Post> posts;
}

@Data
class Post {
  private long id;
  private String title;
}

@Data
class CommentResponse {
  private Comment data;
}

@Data
class Comment {
  private long id;
  private String message;
}
 

Комментарии:

1. Несколько вопросов о невидимом коде. user.getComments() Возвращает ли список сообщений (не комментариев, как следует из названия)? И getComments(user,post) должен возвращать только один комментарий (это Mono)?

2. Извините, это была опечатка, должен был быть user.getPosts() вместо getComments() . Я обновил код. И я думаю, что это может быть связано с http-клиентом и его пулом .. потому что, если вы сделаете то же самое с макетными данными с некоторыми задержками, без использования webclient: время выполнения такое же