首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >boot @Async :使用spring创建1000个线程的最佳方式是什么?

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

Stack Overflow用户
提问于 2019-12-20 22:52:52
回答 4查看 505关注 0票数 2

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

EN

回答 4

Stack Overflow用户

发布于 2019-12-20 23:34:12

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

代码语言:javascript
运行
复制
<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美元

票数 3
EN

Stack Overflow用户

发布于 2019-12-21 00:06:34

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

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

  • 您是如何接收请求的?通过HTTP?LAN还是WAN?是否可以将其更改为其他内容,例如,因为请求数据是从外部数据库生成的。
  • 您是如何处理这些请求的?是进行CPU限制计算,还是向其他系统发出扇出请求以丰富数据。
  • 如何保存处理结果?
  • 您计划如何处理故障?如果一个请求处理失败,您是否计划重复6亿次请求?
票数 1
EN

Stack Overflow用户

发布于 2019-12-20 23:57:54

如果必须使用Spring,您可以使用Spring Cloud Data Flow而不是Apache Beam。

如果你想只使用Tomcat & Spring Boot来实现这一点,你必须增加实例的数量。向上扩展将提供更多内核,这可能不是最好的方法。

另外,我建议将Tomcat与NIO一起使用,这将提高性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59427206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档