Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Web服务器-用于逐步IO操作的并行工作者设计与装配线设计_Java_Multithreading_Concurrency - Fatal编程技术网

Java Web服务器-用于逐步IO操作的并行工作者设计与装配线设计

Java Web服务器-用于逐步IO操作的并行工作者设计与装配线设计,java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在编写一个java服务器接口,它包含了http请求的几个步骤,每个步骤需要大约10毫秒才能完成,最终结果不会返回给客户端。方法如下: public void printUserBookList(int userId){ var user = userService.getUser(userId); // http req taking 10 ms to finish var bookShelf = bookShelfService.getShelf(user); // http re

我正在编写一个java服务器接口,它包含了http请求的几个步骤,每个步骤需要大约10毫秒才能完成,最终结果不会返回给客户端。方法如下:

public void printUserBookList(int userId){
  var user = userService.getUser(userId); // http req taking 10 ms to finish
  var bookShelf = bookShelfService.getShelf(user); // http req taking 10 ms to finish
  var books = bookService.getBooks(bookShelf); // http req taking 10 ms to finish
  printService.print(books); // http req taking 10 ms to finish
}
为了获得更好的吞吐量和性能,我应该使用哪种并发模型

  • 并行工作者设计(所有步骤逐一同步执行)
  • 只要有传入请求,tomcat服务器就会自动将任务分配给线程(如果可能)。任务本身是同步执行的。例如,如果总共有4个步骤,每个步骤需要10毫秒才能完成,那么完成此任务将需要40毫秒,然后工作线程将被释放以接受另一个任务。这种设计要求每个工人完成任务的时间更长

  • 装配线设计(所有步骤逐一异步执行)
  • 任务中的步骤将由不同的参与者处理。每个参与者都有自己的后台线程池。任务中的所有步骤都是异步执行的,因此每个顶级工作人员都可以在收到任务后立即完成任务。但这种设计在每一步都需要更多的
    threadpoolexecutor

    演员风格设计:

    public void printUserBookList(int userId){
      userActor.getUserAndThenGoNextStepAsync(userId);
      // inside getUserAndThenGoNextStepAsync, IO operations are executed by another threadPoolExecutor
      // and the result will be passed to the successors for further async executions
    }
    

    对于普通的tomcat服务器,哪种设计可以保证更好的吞吐量和性能?全异步设计会更好地利用CPU使用率吗?

    增加额外的线程池(特别是为每个步骤单独设置一个线程池)不太可能为您提供任何性能优势。如果您想测试它,您应该尝试使用chained
    CompatibleFutures
    进行步骤。然后,您可以轻松地使用不同的线程池设置进行测试。虽然这种方法需要40毫秒,但我不会太担心效率。即使是一个线程也会给您30个操作/秒。不清楚同一请求的不同步骤是否可以并行执行。@AlexeiKaigorodov不,不同的步骤仍然应该一步一步执行,但它们都像单向消息,使用第一个变量。第二种变体只会增加更多的开销。