Java boot@Async:使用spring创建1000个线程的最佳方法是什么
我需要以多线程方式处理6亿条记录,每个请求需要5-6秒。在启动应用程序中,我需要创建1000个线程,但tomcat只支持200个。最好的方法是什么?您可以完全控制Tomcat在/apache Tomcat/conf/server.xml中创建的线程数: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"
<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请求李>