Tomcat - 每个请求一个线程 - 或其他替代方案?

时间:2013-08-04 03:16:24

标签: multithreading tomcat xmlhttprequest request long-polling

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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