将Java线程分布在多个服务器上?

8
我对Java还不是很熟悉,但非常喜欢学习它。我已经编写了一个程序,它的表现不错,但当我添加更多数据进行处理时,速度会变慢。我将它改为多线程后,速度快了很多,但现在我想尝试进一步提高它的速度(显然,需要处理的数据越多,时间就越长)。值得一提的是,我的程序不会在线程之间共享任何数据,它只获取列表中的一个项目,执行一些数学运算,并将结果上传到数据库中。理想情况下,几台工作计算机可以获取列表中的几个项目,然后处理它们,直到完成。
我做了一些研究,发现队列可能是我需要的,但我不确定是否有其他解决方案(我也在考虑维护完整性/监视工作者可能会让我这个新手写得太复杂)。我家里有4台计算机(其中一些是Linux、Mac和Windows系统,但如果这些解决方案是操作系统特定的话,我可以在所有非Linux系统上安装Linux虚拟机),我希望尝试让它们也开始处理这个任务。我考虑创建Java队列,让其他客户端获取其中一部分并进行处理,但我也看到了库(rabbitmq)。我也简要地了解了网格计算。
这是正确的方法,还是有更好的方法?我不需要任何代码或其他东西,只想知道分配线程的解决方案是什么,评估它们时要考虑哪些因素。
4个回答

9
你可以使用JMS或Hazelcast(例如分布式ExecutorService)在机器之间分发工作。
我建议首先优化算法。通过性能分析、重构和调整,通常能够以较少的复杂性获得10-1000倍的性能提升,可能比使用4台机器快2-4倍。

7

总的来说 - 你已经完成了 扩展,现在你想要进行 横向扩展。从我个人的角度想到的方法:

  • :您可以创建一个Java Queue,它将自动分布在整个集群中。基本上,您使用几个线程从队列中读取数据运行相同的应用程序。Terracotta会神奇地分发该队列,使其感觉像本地对象。

  • - 与Terracotta类似的方法,分布式数据结构和执行器

  • - 将工作片段的消息发送到JMS队列(再次是队列),并具有多个侦听器。每个侦听器更或多或少是单个线程。可以在不同的计算机上设置侦听器。

  • - Map/Reduce Java框架,可轻松扩展大量数据。通常用于处理数据和聚合结果。


2
通常,使用队列(例如RabbitMQ)来加载“作业”,然后让工作者从队列中提取作业进行处理,是最具可伸缩性的模式,而且不需要太多工作即可启动和运行。
一旦这个流程建立起来,你可以启动任何你需要的工作者,并将它们分布在你拥有或需要的任何机器上。
在一般的“消息传递”体系架构建立之后,下一步总是要找出导致进程变慢的原因。并不是所有问题都能通过在一个盒子上增加更多线程或在集群中增加更多盒子来解决(但其中很多问题确实可以解决)。
例如,如果作业受CPU限制,那么在单个盒子上运行更多线程是没有意义的,因为你没有足够的核心来运行它们(-1个核心用于管理线程)。
然而,如果操作受磁盘或网络限制,这些类型的作业可以在作业的内部以异步方式构建,从而允许其他线程在第一个线程等待磁盘或网络返回所需内容时进入。
最终,“消息传递”体系结构是最重要的部分,之后就是优化作业并有效利用资源,这需要对该领域有深入的了解。
如果你完成了大部分作业的优化,你可以开始考虑使用快速键值缓存(如Redis)进行进程间缓存技术,这样你就不需要一遍又一遍地重新计算所需的数据。

1

你不需要虚拟机来运行Java。很可能你的程序在三个主要操作系统上都能正常运行,没有任何问题。

我会选择最简单的解决方案。有一个主进程检索任务,分配给工作计算机,收集结果并将其提交到数据库。

使用套接字连接计算机。每个工作计算机可以生成n+1个线程,其中n是该计算机上CPU核心的数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接