如何在tomcat上处理2000 +请求/秒?

2022-09-01 15:45:18

我正在用Java开发一个SMS应用程序。我的客户通过SMS发送查询,这些查询将通过SMS网关以http请求的形式转发到我的服务器。现在,我的应用处理请求,并通过 SMS 网关再次将响应发回客户端。最多仅发送 300 个字符作为响应。我预计流量非常高(2000个请求/秒)。我想与一些虚拟主机公司(考虑mochahost)托管我的应用程序。在托管之前,我应该考虑哪些因素(RAM,CPU等的插接),以及主要的瓶颈是什么?如果调整得当,专用的tomcat服务器可以处理如此高的流量吗?你有什么建议?

没有数据库交互(我只使用Java堆内存)。我用JMeter(100个请求/秒)运行了一个测试。我的堆内存使用量为35MB,平均响应时间为532ms。而且我没有使用任何会话变量。


答案 1

在不知道你在 servlet 中做了什么的情况下,很难回答你的问题。但简短的答案是,它真的与雄猫没有任何关系。

我们目前使用戴尔R410(双四核,32G内存)用于我们的Tomcat服务器。对于与后端的 membase 集群通信的 REST 服务,我们可以在单个服务器上轻松处理 ~ 15k req/秒(这是使用 Jersey JAX-RS 实现)。我们目前在 F5 负载均衡器后面有 4 个。这些请求中的每一个平均在大约10ms内得到处理。

它真正归结为并发性;您的 servlet 需要多长时间才能完成它需要对请求执行的操作。您已经为每个并发请求提供了一个线程,因此,如果您尝试2000 req / sec,并且单个请求需要500ms来处理...您将需要一些硬件。问题不在于tomcat,而在于你的servlet的可用资源之一。


答案 2

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


推荐