【问题标题】:Tomcat - one thread per request - or other alternatives?Tomcat - 每个请求一个线程 - 或其他替代方案?
【发布时间】:2013-08-04 03:16:24
【问题描述】:

我的理解是,在 Tomcat 中,每个请求将占用一个 Java/(以及操作系统)线程。

想象一下,我有一个包含大量长时间运行请求的应用程序(例如,有多个玩家的扑克游戏),其中涉及游戏内聊天和 AJAX 长轮询等。

有没有办法更改我的 webapp 的 tomcat 配置/架构,这样我就不会为每个请求使用线程,而是“拦截”请求和响应,以便可以将它们作为队列的一部分进行处理?

【问题讨论】:

  • 我最近在工作中遇到了同样的问题。我阅读了这篇文章,它回答了我的许多问题:javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html
  • 如果您有一个很长的请求发生,为什么您希望将它与所有其他请求一起添加到队列中,而不是放在它自己的线程中,相对于所有其他请求/线程异步运行?跨度>

标签: multithreading tomcat xmlhttprequest request long-polling


【解决方案1】:

我认为你说得对,tomcat 喜欢在自己的线程中处理每个请求。这对于多个并发线程可能是有问题的。我有以下建议:

  • 在 server.xml 中配置 Connector 元素的 maxThreads 和 acceptCount 属性。通过这种方式,您可以将可以产生的线程数限制在阈值内。一旦达到该限制,请求就会排队。 acceptCount 属性就是设置这个队列的大小。最简单的实施,但不是一个好的长期解决方案

  • 在 server.xml 中配置多个 Connector 元素,并通过在 server.xml 中添加 Executor 元素使它们共享一个线程池。您可能希望将 tomcat 指向您自己的 Executor 接口实现。

  • 如果您想要更精细地控制请求而不是如何处理请求,请考虑实施您自己的连接器。 server.xml 中连接器元素的“协议”属性应指向您的新连接器。我这样做是为了添加一个自定义 SSL 连接器,效果很好。

  • 您是否会将此问题简化为一般要求,以使 tomcat 在请求/连接数方面更具可扩展性?对此的通用解决方案是配置负载均衡器来处理多个 tomcat 实例。

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2012-12-27
    • 2014-07-08
    相关资源
    最近更新 更多