代码之家  ›  专栏  ›  技术社区  ›  Epcylon

消费池的自动缩放

  •  1
  • Epcylon  · 技术社区  · 15 年前

    我们有一个Web应用程序,允许用户触发对外部资源的请求。外部资源花费不确定的时间来收集结果,因此我们必须对其进行轮询以获取更新,并在完成后收集最终结果。

    我们希望这样做,当用户触发请求时,它将被添加到队列中,然后许多工作线程将拾取每个请求并进行轮询,而用户则执行其他操作。

    由于请求的数量在一天中变化很大,我们认为当速度较慢时,让许多工人什么也不做是浪费资源,但同时我们需要有足够的工人来处理系统的峰值负载。

    我们想要一些可以在有很多请求等待时添加更多工人的东西,但是在没有什么事情可做的时候就杀死工人。

    使用EJB可以/曾经可以这样做,但我们不想使用它。我们也不想使用JMS或其他大型框架来处理这个问题,除非它是我们已经在使用的框架(Spring、Quartz、许多Apache工具)。

    因为EJB支持这一点,而且它是其中一个更有用的特性,所以我们认为已经有人为我们解决了这个问题。建议?

    2 回复  |  直到 13 年前
        1
  •  7
  •   RivieraKid    13 年前

    使用A ThreadPoolExecutor 具有适当的核心和最大池大小值。

    但是请记住,拥有数百个空闲线程并没有很大的成本,因此您可以考虑只使用 Executors.newFixedThreadPool() .

        2
  •  1
  •   Dirk    15 年前

    java.util.concurrent.ThreadPoolExecutor documentation :

    如果池当前具有比CopePoLosithType多的线程,则多余的线程将被终止,如果它们已经闲置超过KePayLaveTimE(参见GETKEPIPALVETIME(Java.UTI.Orth.TimeUnt))。这提供了一种在池未被积极使用时减少资源消耗的方法。如果池稍后变得更活跃,将构造新线程。

    所以,我建议你先试试Java标准库。您需要稍微调整参数,但是线程池是高度可配置的。