我正在使用 Spring Webflux(带有 spring-reactor-netty)2.1.0.RC1 和 Lettuce 5.1.1.RELEASE。
当我使用 Reactive Lettuce API 调用任何 Redis 操作时,执行总是切换到同一个单独的线程 (lettuce-nioEventLoop-4-1)。
这导致性能不佳,因为所有执行都在该单个线程中成为瓶颈。
我知道publishOn
每次调用 Redis 时我都可以使用它来切换到另一个线程,但这很容易出错并且仍然不是最优的。
有什么办法可以改善吗?我看到 Lettuce 提供了 ClientResources 类来自定义线程分配,但我找不到任何方法将它与 Spring webflux 集成。
此外,对于粗心的开发人员来说,当前的行为会不会很危险?也许应该稍微调整一下默认值。我想理想的情况是 Lettuce 可以重用来自 webflux 的相同事件循环。
我正在添加这个 Spring Boot 单类片段,可用于重现我所描述的内容:
@SpringBootApplication
public class ReactiveApplication {
public static void main(String[] args) {
SpringApplication.run(ReactiveApplication.class, args);
}
}
@Controller
class TestController {
private final RedisReactiveCommands<String, String> redis = RedisClient.create("redis://localhost:6379").connect().reactive();
@RequestMapping("/test")
public Mono<Void> test() {
return redis.exists("key")
.doOnSubscribe(subscription -> System.out.println("\nonSubscribe called on thread " + Thread.currentThread().getName()))
.doOnNext(aLong -> System.out.println("onNext called on thread " + Thread.currentThread().getName()))
.then();
}
}
如果我继续调用/test
端点,我会得到以下输出:
onSubscribe called on thread reactor-http-nio-2
onNext called on thread lettuce-nioEventLoop-4-1
onSubscribe called on thread reactor-http-nio-3
onNext called on thread lettuce-nioEventLoop-4-1
onSubscribe called on thread reactor-http-nio-4
onNext called on thread lettuce-nioEventLoop-4-1