2012-03-02 72 views
8

我对Java很新,很享受学习它。我编写了一个运行良好的程序,但是当我添加更多的数据进行处理时,需要花费很长时间。我把它做了线程化,并且真的加速了它,但是现在我正试图加速它的速度(显然需要更多的数据来处理它需要的时间)。只是一个fyi,我的程序不会在线程之间共享任何数据,它会得到列表中的一个项目并执行一些数学操作并将结果上传到数据库。理想情况下,几台工作的计算机得到列表中的几项,然后完成它的工作,然后得到更多的工作,直到它完成在多个服务器上分配java线程?

我做了一些研究,发现队列,并不知道它是我需要还是如果还有别的东西(也是我认为维护员工的诚信/监督对于我来说可能是太多了,不足以成为新手)。我家里有4台电脑(一些Linux,Mac和Windows ..但是如果这些解决方案是特定的,我可以在所有的非Linux系统上安装linux虚拟机),并且想要让他们也开始处理这个任务。我想过创建Java队列,其他客户端需要做一些工作,但我也看到了库(rabbitmq)。我也简要介绍了网格计算。

这是要走的路吗还是有更好的方法?我不需要任何代码或任何东西只是想知道什么是分配线程的解决方案或评估它们时使用什么因素。

回答

7

刚刚结束 - 你已经放大了,现在你想要横向扩展。从我的头顶:

  • :您可以创建一个Java Queue将整个集群进行自动分配。基本上,你可以运行相同的应用程序,只需很少的线程从队列中读取数据兵马俑神奇地分发那个队列,所以感觉就像是本地对象。

  • - 类似的方法来陶土,分布式数据结构和执行器

  • - 发送具有一个作品到JMS队列的消息(队列,再次),并且具有几个听众。每个监听器或多或少都是单个线程。听众可以设置在不同的机器上。

  • - 映射/减少Java框架以轻松地扩展大量数据。通常用于处理数据和聚合结果。

9

您可以使用JMS或Hazelcast(例如分布式ExecutorService)在机器之间分配工作。

我会先做的是看看改善你的算法。您可能发现使用4台机器的速度可以提高2-4倍,但通过性能分析,重构和调谐,您可以获得10-1000倍的性能提升,而且复杂性通常较低。

1

您不需要虚拟VM来运行Java。大多数情况下,您的程序在所有三个主要操作系统上运行都没有任何问题。

我会用最简单的解决方案。让主进程检索任务,分发给工作计算机,收集结果并将它们提交给数据库。

连接电脑与插座。每个工作人员可以跨越n+1线程,其中n是该机器上的CPU核心数量。

2

一般情况下,使用队列(如RabbitMQ的)加载在“工作”,然后有工人拉作业从队列中进行处理的是,这并不需要太多的工作最可扩展模式起床并跑步。

一旦到位,您就可以启动您需要的任何工作人员,并将其传播到您有/需要的任何机器上。

在一般的“消息传递”体系结构到位之后,下一步总是找出造成进程缓慢的原因。并不是所有的问题都可以通过在一个盒子或更多的盒子上放置更多的线程来解决(然而很多人可以)。

例如,如果作业是CPU绑定的,那么在单个盒子上运行更多线程比运行它们的核心没有意义(-1核心用于管理线程)。

但是,如果这些操作是磁盘或网络绑定的,那么这些作业可以在内部以异步方式构建,以允许其他线程在第一个等待磁盘或网络等待时启动回到它所要求的。

最终,消息传递体系结构是最重要的部分,然后就是优化作业和高效使用资源,这就需要对域进行深入了解。

如果您通过大部分优化工作,您可能会开始使用像Redis这样的快速键值缓存来查看进程间缓存技术,这样您就不需要重新计算一遍又一遍的数据。