同时处理多个请求

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);

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