同时处理多个请求

时间:2018-05-23 10:04:48

标签: java multithreading jersey

我有一个服务类

    @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内存耗尽。 / p>

我是否可以通过其他方式立即启动处理,而无需在30秒内处理请求数量并处理所有请求,并且还限制线程活动工作线程的数量。

我找到的一种方法是Producer-Consumer实现,我可以接受所有请求并同时放入生产者,我的消费者接收请求并开始处理它。对于这个实现,我需要指定最大值生产者可以接受的请求(例如:100 000)和没有可以处理请求的消费者(例如:1000),因此只有1000个线程处于活动状态并且一个接一个地处理但是这个方法的问题是如果有的话消费者(工作)线程如果由于某种原因导致锁定,如果没有释放,则只剩下剩余的未锁定线程来处理请求,并且生成器中的传入请求不断增加。只增加消费者的数量就会创造更多的工作线程,但同时可能有很多锁定的线程处理任务。

请让我知道我可以采用的任何其他方法。

注意:所有请求都应在30秒内处理,如果无法执行,则无法通过成功标准。

3 个答案:

答案 0 :(得分:1)

你可能想要一个排队机制,比如RabbitMq。

您的应用程序将按以下方式运行:

request -> push to queue -> return ACK to client

queue -> worker threads.

queue消费者速度取决于您的工作线程速度,因此您永远不会耗尽您的系统。

在负载下,大量的消息将排队,这意味着您的工作人员可靠地从队列中获取消息并处理它们。

答案 1 :(得分:0)

您的需要是处理大量的(可能是并发的)请求,并且还希望控制生成的线程数(最大线程数上限)。最好的选择是使用ExecuterService,它是一种托管线程池,您可以在其中指定线程池大小并提交多个Runnable或Callable对象进行处理。

ExecutorService executorService = Executors.newFixedThreadPool(10);

这里解释得很好。 Thread Concurrency using ExecutorService in Java 8

答案 2 :(得分:-1)

您可以使用排队系统将请求放入队列并确认客户端有关处理的信息,稍后您可以处理队列