我有一台tomcat服务器。在tomcat服务器中,我处理了一些restful请求,这些请求调用了内存使用率非常高的服务器,这可能会持续15分钟,最终导致tomcat崩溃。
我如何运行这个请求: 1.不使tomcat崩溃? 2.不超过restful请求的3分钟限制?
谢谢。
发布于 2019-11-24 16:24:15
基本上,你所问的问题可以归结为:
对于在Tomcat上运行的一些任务,我没有告诉你任何事情,我如何让它运行得更快,使用更少的内存,而不会崩溃。
在一般情况下,你需要分析你的代码,找出为什么它花了这么长的时间和使用了这么多的内存。然后,您需要根据需要对其进行修改或重写,以降低内存使用率,提高效率。
我不认为在没有更多细节的情况下,我们可以提供明智的建议来让请求更快,等等。例如,有些人建议将请求拆分为较小的请求,或者异步执行较大的请求,这些建议不一定会有帮助。在没有了解真正的问题之前,你不应该尝试这些想法。
也有可能是您的任务耗时太长,并且由于特定原因导致Tomcat崩溃:
OutOfMemoryError
而失败。内存的过度使用可能与请求的任务大小有关,过度的内存使用可能是由您的代码中的错误(内存泄漏)或某个第三方库中的错误(内存泄漏)引起的,该问题可以通过以下方法解决:- increasing Tomcat's heapsize,
- fixing the memory leak, or
- limiting the size of the "problem" that the request is trying to solve.
也有可能你的代码中有一个bug;例如一个无限循环。
总而言之,您没有提供足够的信息来进行正确的诊断。我们能做的最多的就是提出可能的原因。我猜,真的。
发布于 2019-11-24 16:42:31
尝试另一种架构方法。REST被设计成无状态的,所以你必须引入状态。
我建议你去实现...
在后台以批处理的形式提交长时间运行的任务(如@kamran-ghiasvand所建议的)。
为了让您了解在后端可能需要什么,我在下面引用了我们的PaymentService接口。
public interface PaymentService {
PnExecution createPaymentExecution(List<Period> Periods, Date calculationDate) throws PnValidationException;
Long createPaymentExecutionAsync(List<Period> Periods, Date calculationDate);
PnExecution simulatePaymentExecution(Period Period, Date calculationDate) throws PnValidationException;
Void deletePaymentExecution(Long pnExecutionId, AsyncTaskListener<?, ?> listener);
Long deletePaymentExecutionAsync(Long pnExecutionId);
void removePaymentNotificationFromPaymentExecution(Long pnExecutionId, Pn paymentNotification);
}
关于性能:尝试找到内存消耗者,并尝试将问题排序,将其分成几个步骤。确保您没有通过引用未使用的对象来创建内存泄漏。最后的办法是并发(独立任务)或并行(处理相似任务)。但这些问题中的大多数都是过于直接的体系结构方法造成的。
发布于 2019-11-24 16:50:48
tomcat服务器崩溃与请求处理时间无关,但它可能是由于JVM堆内存溢出(或数千种其他原因)造成的。你应该通过仔细调查tomcat日志来确定崩溃的原因。如果原因是内存不足,您可以在启动tomcat时使用'-Xmx‘标志为JVM分配更多的内存。例如,您可以在您的setenv.sh
中添加以下行,以便为tomcat分配2 2GB的ram:
CATALINA_OPTS="-Xmx2048m"
在请求超时方面,也有许多原因在这里发挥作用。例如,http连接器的connectionTimeout
(请参阅server.xml
)、网络或浏览器或web客户端限制以及许多其他原因。
一般来说,通过restful请求同步发出这么长的请求是非常糟糕的做法。我建议您考虑另一种解决方法,例如websocket或推送通知,用于通知用户其耗时的请求已在服务器端完成。
https://stackoverflow.com/questions/59015505
复制相似问题