java的threadpoolexecutor能否在应用程序级别充当负载平衡器?

brjng4g3  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(300)

使用threadpoolexecutor,我们可以通过限制最大线程数来定义服务器应处理的最大请求数。
另外,threadpoolexecutor将额外的传入请求添加到线程队列中。
因此,在应用程序级别,可以使用threadpoolexecutor编写基于应用程序需求的自定义逻辑来限制或拒绝某些请求。
因此,它能否在应用程序级别充当负载平衡器?

x7rlezfr

x7rlezfr1#

如果您接受“负载平衡”的广义定义,那么可以将threadpoolexecutor视为一种负载平衡器。
根据wikipedia对负载平衡的广泛定义:
在计算中,负载平衡指的是将一组任务分布在一组资源(计算单元)上的过程,目的是使它们的整体处理效率更高。
对于线程池执行器,任务是 Runnable 或者 Callable 你需要逃跑。线程池管理的线程是在其中分配任务的资源。线程池的目标是通过确保只要有需要执行的任务,就没有线程保持空闲,从而提高整体处理效率。
另一方面,这个问题的措辞表明您正在考虑另一种负载平衡:web服务请求分布在服务器机器上,您希望在满足服务需求的同时避免任何特定机器过载。在这种情况下,您可以使用threadpoolexecutor作为负载平衡系统的一部分,但它本身并不是一个完整的解决方案:threadpoolexecutor只在一台机器上的线程之间分配任务。它没有办法响应来自远程机器的请求,也没有向远程机器发送任务。

hvvq6cgz

hvvq6cgz2#

从理论上讲,我们可以通过使用 ExecutorService s。在实践中,存在一些局限性。例如,什么 ThreadPoolExecutor 时间表就是任务。任务在java线程上运行,java线程Map到os线程上。java线程不能卸载任务,除非它定期或例外地完成。但是,os线程可以卸载java线程并加载另一个进程。
java线程无法卸载未完成的任务这一事实的后果是,系统可能会面临线程不足:当(父)任务创建新(子)任务时,父任务需要子任务的结果才能继续,我们可能会遇到这样一种情况:所有java线程都被困在等待子任务完成的父任务上,而没有线程能够取得进展,因为没有线程可以执行子任务。
有人试图绕过这个瓶颈,例如 ForkJoinPool 可能开始额外的 Thread 以解决线程不足问题。然而,不能保证总是避免或解决线程匮乏(这就是为什么vert.x或webflux等框架拒绝阻塞操作或将它们委托给专用线程的原因之一)。
此外,正如daniel kullmann在评论中提到的,负载平衡器试图平衡工作。在 ThreadPoolExecutor s、 有一个共享队列和线程主动拉任务,所以没有主动平衡。这些是不同的概念。

相关问题