[ISSUE #13822]: separation of responsibilities of client executor and login scheduled executor#13878
Conversation
…tor and login scheduled executor
|
Thanks for your this PR. 🙏 感谢您提交的PR。 🙏 |
|
clientworker和fuzzywatcher中的任务是一个后台持续执行的任务,会长时间占用线程,并不适合使用多个线程的线程池。这个bug本质上的问题是创建的线程池和运行任务的场景不适配,在ConfigTransportClient中定义executor时无法感知在子类中如何使用它,因此会比较容易产生bug。 建议将 loginExecutor, listenerExecutor,fuzzyWatcherExecutor定义为3个明确的独立singleExecutor ,并确保在ConfigTransportClient,ClientWorker,ConfigFuzzyWatchGroupKeyHolder的shutdown方法中安全的终止线程。
|
好的,我理解了你的想法,之后我会按照这个方案修改,现在我有一个疑问,在 |
在ConfigFuzzyWatchGroupKeyHolder中单独起一个独立的newSingleThreadExecutor来执行fuzzyWatch任务,你说的这个 "保留一个多线程的线程池"当前只服务于login接口,可以保留ConfigTransportClient中的executor(newSingleThreadExecutor)来执行login任务,就是你当前pr里面的executor和loginExecutor合并成一个newSingleThreadExecutor即可,但是这个线程池不向子类暴露 |
|
client/src/main/java/com/alibaba/nacos/client/config/impl/ConfigFuzzyWatchGroupKeyHolder.java
Outdated
Show resolved
Hide resolved
| private final long securityInfoRefreshIntervalMills = TimeUnit.SECONDS.toMillis(5); | ||
|
|
||
|
|
||
| private ScheduledExecutorService loginScheduledExecutor; |
There was a problem hiding this comment.
loginScheduledExecutor 是否可以去掉,使用executor即可?
There was a problem hiding this comment.
loginScheduledExecutor 是否可以去掉,使用executor即可?
O(∩_∩)O,我说说我的想法,看看你的意见:
- 我想保留
loginScheduledExecutor的原因是loginScheduledExecutor执行的是ScheduledExecutorService#scheduleWithFixedDelay方法,它是一个本地定期执行的定时登录任务,所以我想把它放在一个专用的只有 1 个线程的ScheduledExecutorService线程池中去执行,就像上边将while(true)的忙任务分离出来一样 ConfigTransportClient#executor我把它定义的类型是ThreadPoolExecutor,它没有专有的命名,我觉得定位更像是一个在 Client 中较为通用的线程池,就像它现在已经被用作去处理模糊监听的任务了,之后如果有线程池需要的话,可以通过ConfigTransportClient#getExecutor方法获取并复用。如果将loginScheduledExecutor去掉的话,那么需要把ConfigTransportClient#executor定义成ScheduledExecutorService类型,那么它就更像是一个能够执行定时任务的线程池了,但是可能本地启动定时任务的场景好像不是很多
There was a problem hiding this comment.
loginScheduledExecutor 是否可以去掉,使用executor即可?
O(∩_∩)O,我说说我的想法,看看你的意见:
- 我想保留
loginScheduledExecutor的原因是loginScheduledExecutor执行的是ScheduledExecutorService#scheduleWithFixedDelay方法,它是一个本地定期执行的定时登录任务,所以我想把它放在一个专用的只有 1 个线程的ScheduledExecutorService线程池中去执行,就像上边将while(true)的忙任务分离出来一样ConfigTransportClient#executor我把它定义的类型是ThreadPoolExecutor,它没有专有的命名,我觉得定位更像是一个在 Client 中较为通用的线程池,就像它现在已经被用作去处理模糊监听的任务了,之后如果有线程池需要的话,可以通过ConfigTransportClient#getExecutor方法获取并复用。如果将loginScheduledExecutor去掉的话,那么需要把ConfigTransportClient#executor定义成ScheduledExecutorService类型,那么它就更像是一个能够执行定时任务的线程池了,但是可能本地启动定时任务的场景好像不是很多
可以,按照你的想法,会清晰明确一些。
@KomachiSion @shiyiyue1102 二位好,Hi~ o( ̄▽ ̄)ブ
我对这个 ISSUE 的理解:如果只是单纯的解决表面的问题的话,可以直接将 ClientWorker#MIN_THREAD_NUM 字段调整为 3 或更大,但是如果未来出现对 ConfigTransportClient#executor 线程池中再添加一个循环的忙任务,可能还会产生同样的问题,所以我做了以下调整:
请有时间帮忙 review~ 感谢~ 同时也听听二位的建议~