gpt4 book ai didi

spring-webflux - 使用 subscribeOn 和 publishOn 时的最佳实践

转载 作者:行者123 更新时间:2023-12-04 21:30:05 27 4
gpt4 key购买 nike

我正在使用 Project Reactor对于我正在写的新服务。我正在使用 Spring 5Netty .我正在与一堆不同的服务和关系数据库进行交互。所有这些服务都有一个阻塞的客户端和 JDBC也在阻拦。所以基本上这些网络调用都没有返回发布者。

我的问题是使用所有阻塞 API 时的最佳做法应该是什么。目前我所做的是将所有阻塞 API 代码包装到 Mono.callable 中。并使用了subscribeOn(Scheduler.elastic()) .所以基本上所有的阻塞工作都是在一个弹性线程池上完成的。

问题1。我应该创建一个专用的线程池执行器而不是使用弹性吗?如果是,那为什么?或者我应该为每个不同的服务创建一个专用的弹性池?

问题2。当阻塞方法返回结果时,我应该使用publishOn吗?以便主线程再次开始处理?
如果是,我怎样才能获得主线程(netty 事件循环线程?)引用?

问题3。如果我在多个不同的运算符中调用多个阻塞调用(一些在链接时,一些在使用 zip() 调用时)然后使用 subscribe publish又一次subscribe publish不会做很多上下文切换吗?

这些问题中的大多数都与最佳实践有关。

最佳答案

Most of these questions are related to what should be the best practices.



Reactive Java 仍处于起步阶段,因此很难找到公认的“最佳实践”(在大多数情况下,整个社区尚未形成共识,因此只有 reactor 开发团队和其他一些人提供了一些指导.)

话虽如此,我认为现在有一些相当广泛接受的观点在这里会有所帮助。首先,您声明:

All of these services have a client that is blocking.



这可能是最简单的一点,就好像您没有与大量非阻塞的其他服务进行交互一样,使用 react 器根本没有意义。如果您有明确的迁移路径将这些服务重写为非阻塞,则异常(exception)情况。

JDBC is also blocking



R2DBC不是,并且可能值得研究(尽管该项目还处于早期阶段。)

Shall I create a dedicated thread pool executor rather than using elastic?



没有必要。 (答案是"is"的唯一原因是,如果您有非常具体的线程要求,需要对该执行程序服务进行特定的“调整”,但如果是这种情况,您就不会问这个问题。)

考虑 boundedElastic() 然而,相反,因为这对调度程序中的事件线程数量设置了上限,这可以减少造成背压问题的线程数失控。此调度程序专门设计用于与遗留的阻塞 IO 库接口(interface)。

shall I create a dedicate elastic pool for each of different service?



除非你有特殊的理由。这在 boundedElastic() 中会更相关。如果您想要为不同的服务单独(或不同)绑定(bind),调度程序。 (仅仅创建一个这样你就可以“给它一个相关的名字”并不是一个足够好的理由恕我直言。)

When blocking method return result, shall I use publishOn so that main thread picks up processing again?



这完全取决于您的用例——reactor 故意与并发无关,因此这取决于您是否需要在“主线程”中发布结果。 (根据我的经验,通常你不在乎。)

how can I get main thread reference back?


publishOn(Schedulers.immediate())可用于在您调用的当前线程上发布。

If I’m calling multiple blocking calls in multiple different operators (some while chaining, some while using zip() call) then using subscribe publish and again subscribe publish wouldn’t make a lot of context switching?



这取决于。但是,是的,当然有可能——这又回到了我的第一点。除非您花在非阻塞代码上的时间超过了在线程池中调用阻塞服务的时间,否则几乎没有切换的动力(除非您计划在核心到位时将服务逐步迁移到非阻塞。)

从切换到 react 器并将其用作前端到阻塞在线程池中的服务,您肯定不会获得性能增强。

关于spring-webflux - 使用 subscribeOn 和 publishOn 时的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54964422/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com