我需要以多线程的方式处理6亿条记录,每个请求需要5-6秒。在启动应用程序中,我需要创建1000个线程,但tomcat只支持200个线程。继续的最佳方式是什么?
发布于 2019-12-20 23:34:12
您完全可以控制Tomcat在/apache-tomcat/conf/server.xml中创建的线程数
<connector connectiontimeout="20000"
maxthreads="1000"
port="8080"
protocol="HTTP/1.1"
redirectport="8443" />
您可以使用操作系统对线程的限制来执行此操作。在mac上是2000。
但是我认为创建1000个线程不会对你有多大帮助。松散地说,您只能执行与您的机器上的核心一样多的并发线程。
因此,使用4核计算机需要大约24年的时间来处理6亿条记录。使用32个内核,您可以将其减少到一位数的年数。
我会怎么做?我会研究像Apache光束这样的东西,它将使你的工作流在许多机器上并行。看看https://cloud.google.com/dataflow/吧。您可以创建您的任务来征用1000台4核机器。谷歌会把它们旋转起来,然后为你拆掉它们。这项工作大约需要9天。信封背面的计算显示,获得答案将花费大约8,640美元
发布于 2019-12-21 00:06:34
如果你想保持效率,你很可能不想使用1000个线程,除非你的机器有1000个CPU。如果你的任务是受CPU限制的,那么工作线程的数量应该接近CPU计数,否则你会在CPU Scheduling上浪费周期。
由于你的问题缺乏任何技术细节,我建议结束它。写一篇新的文章来解释你的问题的基础:
发布于 2019-12-20 23:57:54
如果必须使用Spring,您可以使用Spring Cloud Data Flow而不是Apache Beam。
如果你想只使用Tomcat & Spring Boot来实现这一点,你必须增加实例的数量。向上扩展将提供更多内核,这可能不是最好的方法。
另外,我建议将Tomcat与NIO一起使用,这将提高性能。
https://stackoverflow.com/questions/59427206
复制相似问题