如何优化Mono的zipWhen嵌套写法?能否并行调用Author与Publisher服务
问题描述
我需要获取Book、Author和Publisher的信息,其中Book包含Author和Publisher的ID。目前我通过以下方式获取BookInfo:
bookService.getBook( tenantId, bookId ) .zipWhen( book -> authorService.getAuthor( tenantId, book.getAuthorId() ) ) .zipWhen( tuple -> publisherService.getPublisher( tenantId, tupple.getT1().getPublisherId() ) ) .map( tuple -> new BookInfo( tupple.getT1().getT1(), tupple.getT1().getT2(), tupple.getT2() ) );
我使用zipWhen来共享Book实例供其他方法调用,但最终得到嵌套的Tuple,结构十分混乱。请问有没有更优的实现方式?是否可以并行调用authorService和publisherService?
优化方案
方案一:并行调用+扁平Tuple结构
可以通过flatMap结合Mono.zip实现authorService和publisherService的并行调用,同时避免嵌套Tuple:
bookService.getBook(tenantId, bookId) .flatMap(book -> Mono.zip( Mono.just(book), authorService.getAuthor(tenantId, book.getAuthorId()), publisherService.getPublisher(tenantId, book.getPublisherId()) )) .map(tuple -> new BookInfo(tuple.getT1(), tuple.getT2(), tuple.getT3()));
- 先获取
Book实例后,同时发起Author和Publisher的请求,二者并行执行,比原串行方式效率更高 Mono.zip将三个结果合并为扁平Tuple,后续映射成BookInfo的逻辑更直观,没有嵌套层级
方案二:避免Tuple的写法(Spring WebFlux 3.2+适用)
如果想完全避开Tuple,可先并行获取作者和出版社信息,再和已拿到的Book组装:
bookService.getBook(tenantId, bookId) .flatMap(book -> authorService.getAuthor(tenantId, book.getAuthorId()) .zipWith(publisherService.getPublisher(tenantId, book.getPublisherId())) .map(authorPubPair -> new BookInfo(book, authorPubPair.getT1(), authorPubPair.getT2())) );
这个写法把Book的上下文保留在外部lambda中,仅用一个二元Tuple处理作者和出版社的结果,代码可读性更强。
内容的提问来源于stack exchange,提问作者kylie.zoltan
相关产品推荐
相关产品推荐

