Я использую Spring Webflux (с spring-реактор-нетто) 2.1.0.RC1 и Lettuce 5.1.1.RELEASE.
Когда я вызываю любую операцию Redis с использованием API Reactive Lettuce, выполнение всегда переключается натот же отдельный поток (lettuce-nioEventLoop-4-1).
Это ведет к снижению производительности, поскольку все выполнение становится узким местом в этом отдельном потоке.
Я знаю, что мог бы использовать publishOn
каждый раз, когда я вызываю Redis для переключения на другой поток, но это подвержено ошибкам и все еще не оптимально.
Есть ли способ улучшить это?Я вижу, что Lettuce предоставляет класс ClientResources для настройки распределения потоков, но я не смог найти какой-либо способ интегрировать это с Spring webflux.
Кроме того, не будет ли текущее поведение опасным для небрежного разработчика?Возможно, настройки по умолчанию должны быть немного настроены.Я полагаю, что идеальный сценарий был бы, если бы Lettuce мог просто повторно использовать тот же цикл событий из webflux.
Я добавляю этот фрагмент одноклассного весеннего запуска, который можно использовать для воспроизведения того, что я описываю:
@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