现在写的一个 Filter 有同步调用 Redis 和 Feign 调用其他接口。 听说这样的话是不是会很影响性能,这个应该怎么弄?
1
shaoyijiong 2020-08-07 17:23:37 +08:00
spring data redis 底层用的是 Lettuce 支持非阻塞调用 , 可以使用 ReactiveRedisTemplate
接口的话可以使用 WebClient , 或者 https://github.com/OpenFeign/feign-reactive/issues/20 |
2
gz911122 2020-08-07 17:53:56 +08:00
Feign 可以换用 retrofit 支持异步调用.
反正 Feign 本身就是模仿 retrofit 写的, 俩 api 差不多 |
3
qwerthhusn OP @gz911122 @shaoyijiong
Redis 那里没问题,Spring Data Reactive 可以用。 Feign 的话我能不能通过 Project Reactor 提供的 subscribeOn/publishOn 实现将 feign 的同步代码放到 IO 线程中执行?? 我现在还没绕清楚这个 subscribeOn 和 publishOn 是如何进行线程切换的,像 Spring Data Reactive 这个,是不是也是利用的 subscribeOn/publishOn 进行的线程切换,让 eventLoopGroup 不阻塞,然后 IO 操作在 IO 线程完事后,又把逻辑切回到 eventLoopGroup 的。。 |
4
gz911122 2020-08-10 11:18:50 +08:00
|
5
bianjp 2020-08-12 19:46:47 +08:00
的确不能在 Filter 中写阻塞的代码,前段刚踩过坑。
Filter 是在 Reactor 的事件循环线程中执行的,默认的事件循环线程数量等于 CPU 核心数: reactor.netty.resources.LoopResources#DEFAULT_IO_WORKER_COUNT 如果所有事件循环线程都被阻塞,后续的请求就只能排队等待,严重拖慢请求响应速度。 阻塞的代码可以使用另外的线程池异步执行: Mono.fromCallable(xxxx).subscribeOn(Schedulers.elastic()) |