同时处理多个请求
Process multiple request at same time
我有服务class
@Path("/")
public class ABC {
@Path(/process/{param})
public String processRequest(@PathParam("param") String param){
Thread t = new Thread(()->{
// Do some processing with the param parmeter
System.out.println("Processing started for -> "+ param);
//Do many more things
//DB transactions,etc.
});
t.start();
return "Your request will be processed";
}
}
我接受了一些参数并开始在新线程中处理它,同时为了在 30 秒内完成处理,我通过确认他的请求将被处理来中断与客户的连接。
它工作正常,到目前为止没有任何问题,目前,它可以处理超过 5k 的请求。当同时有很多请求可能超过 50k 时,问题就开始了,所以我的应用程序为每个新请求创建一个新线程,这导致应用程序分配大量内存,有时还会使 JVM 内存耗尽。
有没有其他方法可以立即开始处理而不用担心请求的数量并在 30 秒内处理所有请求并且还可以限制活动线程的数量。
我发现的一种方法是生产者-消费者实现,我可以在其中接受所有请求并同时放入生产者,而我的消费者接收请求并开始处理它,对于此实现,我需要指定最大值生产者可以接受的请求数(例如:100 000)和可以处理请求的消费者数(例如:1000),因此只有 1000 个线程处于活动状态并一个接一个地处理,但这种方法的问题是如果有的话如果由于某种原因锁定并且未释放,则消费者(工作)线程的线程只剩下剩余的未锁定线程来处理请求,并且传入请求在生产者中不断增加。只有增加消费者的数量才能创建更多的工作线程,但同时可能会有很多锁定线程处理任务。
请让我知道我可以使用的任何其他方法。
注意:所有请求都应在 30 秒内处理,如果无法完成则不符合成功标准。
您可以使用排队系统将请求放入队列并确认客户端处理,稍后您可以处理队列
您可能需要一种排队机制,例如 RabbitMq。
您的应用程序将运行像这样:
request -> push to queue -> return ACK to client
queue -> worker threads.
queue
消费者速度由您的工作线程速度决定,因此您永远不会耗尽系统。
在负载下,会有很多消息排队,这意味着您的工作人员会可靠地从队列中获取消息并进行处理。
您需要处理大量(可能是并发的)请求,并且还想控制生成的线程数(线程数的最大上限)。您最好的选择是使用 ExecuterService,这是一种托管线程池,您可以在其中指定线程池大小并提交多个 Runnable 或 Callable 对象进行处理。
ExecutorService executorService = Executors.newFixedThreadPool(10);
我有服务class
@Path("/")
public class ABC {
@Path(/process/{param})
public String processRequest(@PathParam("param") String param){
Thread t = new Thread(()->{
// Do some processing with the param parmeter
System.out.println("Processing started for -> "+ param);
//Do many more things
//DB transactions,etc.
});
t.start();
return "Your request will be processed";
}
}
我接受了一些参数并开始在新线程中处理它,同时为了在 30 秒内完成处理,我通过确认他的请求将被处理来中断与客户的连接。
它工作正常,到目前为止没有任何问题,目前,它可以处理超过 5k 的请求。当同时有很多请求可能超过 50k 时,问题就开始了,所以我的应用程序为每个新请求创建一个新线程,这导致应用程序分配大量内存,有时还会使 JVM 内存耗尽。
有没有其他方法可以立即开始处理而不用担心请求的数量并在 30 秒内处理所有请求并且还可以限制活动线程的数量。
我发现的一种方法是生产者-消费者实现,我可以在其中接受所有请求并同时放入生产者,而我的消费者接收请求并开始处理它,对于此实现,我需要指定最大值生产者可以接受的请求数(例如:100 000)和可以处理请求的消费者数(例如:1000),因此只有 1000 个线程处于活动状态并一个接一个地处理,但这种方法的问题是如果有的话如果由于某种原因锁定并且未释放,则消费者(工作)线程的线程只剩下剩余的未锁定线程来处理请求,并且传入请求在生产者中不断增加。只有增加消费者的数量才能创建更多的工作线程,但同时可能会有很多锁定线程处理任务。
请让我知道我可以使用的任何其他方法。
注意:所有请求都应在 30 秒内处理,如果无法完成则不符合成功标准。
您可以使用排队系统将请求放入队列并确认客户端处理,稍后您可以处理队列
您可能需要一种排队机制,例如 RabbitMq。
您的应用程序将运行像这样:
request -> push to queue -> return ACK to client
queue -> worker threads.
queue
消费者速度由您的工作线程速度决定,因此您永远不会耗尽系统。
在负载下,会有很多消息排队,这意味着您的工作人员会可靠地从队列中获取消息并进行处理。
您需要处理大量(可能是并发的)请求,并且还想控制生成的线程数(线程数的最大上限)。您最好的选择是使用 ExecuterService,这是一种托管线程池,您可以在其中指定线程池大小并提交多个 Runnable 或 Callable 对象进行处理。
ExecutorService executorService = Executors.newFixedThreadPool(10);