Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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 boot@Async:使用spring创建1000个线程的最佳方法是什么_Java_Spring_Multithreading_Spring Boot_Spring Async - Fatal编程技术网

Java boot@Async:使用spring创建1000个线程的最佳方法是什么

Java boot@Async:使用spring创建1000个线程的最佳方法是什么,java,spring,multithreading,spring-boot,spring-async,Java,Spring,Multithreading,Spring Boot,Spring Async,我需要以多线程方式处理6亿条记录,每个请求需要5-6秒。在启动应用程序中,我需要创建1000个线程,但tomcat只支持200个。最好的方法是什么?您可以完全控制Tomcat在/apache Tomcat/conf/server.xml中创建的线程数: <connector connectiontimeout="20000" maxthreads="1000" port="8080" protocol="HTTP/1.1"

我需要以多线程方式处理6亿条记录,每个请求需要5-6秒。在启动应用程序中,我需要创建1000个线程,但tomcat只支持200个。最好的方法是什么?

您可以完全控制Tomcat在/apache Tomcat/conf/server.xml中创建的线程数:

<connector connectiontimeout="20000"
           maxthreads="1000"
           port="8080"
           protocol="HTTP/1.1"
           redirectport="8443" />

您可以在操作系统限制的线程范围内执行此操作。在mac电脑上是2000

但是我认为创建1000个线程对你没有多大帮助。不严格地说,您只能执行与您的机器上的内核数量相同的并发线程

因此,使用4核机器,处理6亿条记录需要约24年的时间。有了32个核,你将得到一个位数的年数


我该怎么办?我将研究类似ApacheBeam的东西,它将在许多机器上并行化您的工作流。看一看。您可以创建任务以申请1000台4核机器。谷歌会帮你把它们旋转起来,然后拆下来。这项工作大约需要9天。信封背面的计算表明,如果必须使用Spring,那么获得答案将花费您大约8640美元,您可以使用checkout代替Apache Beam

如果您只想通过使用Tomcat和Spring引导来实现这一点,那么必须增加实例的数量。扩展将提供更多的内核,这可能不是最好的方法


我还建议将Tomcat与NIO结合使用,这将提高性能。

在这5-6秒内会发生什么?它是使用CPU进行计算,还是将数据发送到其他地方并等待返回

在第二种情况下,您不需要启动1000个线程来并行执行1000个查询,但是如果其他后端支持@Async,您可以使用@Async。您将只有一个小的输入和输出线程池

您可以使用SpringWebFlux来实现这一点。然而,WebFlux不使用tomcat,而是在Netty上构建的自定义HTTP服务器,请参见


只有当您能够以反应式的方式执行每个步骤时,这才能起作用。在您的情况下,执行SOAP调用使用反应式WebClient发送数据而不阻塞,并在SOAP响应上订阅第二个非阻塞过程以将数据上载到google cloud。

如果您想保持高效,您很可能不想使用1000个线程,除非您的机器有1000个CPU。如果您的任务是CPU受限的,那么工作线程的数量应该接近CPU计数,否则您将在上浪费周期

由于你的问题缺乏任何技术细节,我建议结束它。写一篇新文章,解释问题的基本原理:

  • 您是如何接收请求的?通过HTTP?兰还是万?可以将其更改为其他内容,例如,因为请求数据是从外部数据库生成的
  • 你是如何处理这些请求的?是CPU限制的计算,还是向其他系统发出扇出请求以丰富数据
  • 您如何保存处理结果
  • 你计划如何处理失败?如果一个请求处理失败,您是否计划重复600 mln请求
除了并行化,在该请求中优化的每秒钟节省6亿个工作秒。该问题缺少任何细节来给出相关答案。请编辑并提供更多详细信息。为什么您认为您需要1000个线程。添加更多线程不一定会加快速度(相反,它可能会减慢速度)。实际上,我正在调用soap(http请求),响应时间为3-5秒,然后分析响应并进行另一个rest调用以将数据存储在google cloud中。失败处理:如果一个调用失败,它将跳过并继续。好,我会按照你的建议检查这个。让我解释一下。我正在阅读excel表格,根据表格中的数据创建有效负载并调用soap,然后在收到响应后,我检查响应以及存储在google云中的部分响应数据。一个线程可以在5秒内执行该过程。@Udayan根据您所说的,我建议这样做[作为最佳方式。这样您就不必维护服务器、容器……您只需维护云功能(您的SOAP调用并将其存储到google Cloud).hi Grey,我正在调用soap并在3-4秒内响应,然后我正在处理响应并将其存储在google cloud中。@Udayan您的用例非常适合WebFlux,假设您也可以使用非阻塞调用上传到google cloud。