如何在Tomcat上处理每秒2000个请求?

28
我正在用Java开发一款短信应用程序。我的客户通过短信发送查询,这些查询将通过SMS网关以http请求的形式转发到我的服务器上。现在我的应用程序处理请求并再次通过SMS网关向客户发送响应,最多只能发送300个字符作为响应。我预计将有非常高的访问量(2000个请求/秒)。我想将我的应用程序托管在某个Web托管公司(考虑mochahost)上。在托管之前我需要考虑哪些因素(例如RAM、CPU等),并且主要的瓶颈将会是什么?如果调整得当,专用的Tomcat服务器能够处理如此高的流量吗?你有什么建议吗?
没有数据库交互(我只使用Java堆内存)。我使用JMeter进行了测试(100个请求/秒)。我的堆内存使用率为35MB,平均响应时间为532ms。同时我也没有使用任何会话变量。

每个请求需要进行哪种类型的处理?是否涉及任何数据库交互? - Mike Q
@Mike 这里完全没有涉及到数据库交互。我只使用了Java内存。 - ravi
1
我使用JMeter进行了一项测试(每秒100个请求)。我的堆内存使用量为35MB,平均响应时间为532毫秒。 - ravi
3个回答

33

如果不知道您在Servlet中做了什么,很难回答您的问题。但简短的回答是这与Tomcat没有任何关系。

我们目前使用Dell R410服务器(双四核,32G内存)作为Tomcat服务器。对于一个与后端membase集群通信的REST服务,我们可以轻松地在单个服务器上处理大约15k个请求/秒(使用Jersey JAX-RS实现)。我们当前在F5负载均衡器后面有4台这样的服务器。每个请求的平均服务时间约为10毫秒。

实际上,这取决于并发性;您的Servlet需要多长时间才能完成对请求的处理。每个并发请求都需要一个线程,因此,如果您尝试每秒处理2000个请求,而单个请求需要500毫秒才能处理完...那么您需要更强大的硬件。问题不在于Tomcat,而在于Servlet可用资源的问题。


1
我在这个帖子中提到了你的帖子:https://dev59.com/2lzUa4cB1Zd3GeqP6stR,希望你能参与讨论。 - codecompleting
你在操作系统层面上调整了TIME_WAIT吗?对于connectionTimeout、keepAliveTimeout和maxKeepAliveRequests这些Tomcat配置设置有做过什么调整吗?我有一个类似的应用程序,每秒处理2K个请求,但是Tomcat一段时间后会变得缓慢。 - codecompleting
我喜欢这个答案。 - thonnor

7
一个默认设置的Tomcat服务器在适度硬件上应该可以轻松处理每秒2k个请求,假设每个请求不需要太多工作量。如果处理一个请求需要500毫秒以上的时间,您可能需要增加线程池中的线程数量,并且您可能会开始接近极限。或者,如果您可以将部分工作转移到其他线程,则可以加快响应时间,并且您可以保持默认的200个线程。然后问题就是您的工作线程能否跟上传入请求的速度。这取决于您的负载是恒定还是突发以及您可以接受多少延迟进行处理。这甚至没有涉及HA、DR以及您可以接受的停机时间。这是一个大的平衡行为,有太多变量无法给出简单的答案。

1

看起来你可能需要实现集群/负载均衡方法。可以参考this的示例。


看一下这个链接,它说访问被拒绝。 - Ajay Takur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接