在多个服务器上分发java线程?

时间:2012-03-02 15:01:50

标签: java queue parallel-processing distributed-computing

我是java的新手,非常喜欢学习它。我已经制作了一个运行良好的程序,但是当我添加更多数据进行处理时需要一些时间。我把它做了线程,它确实加速了很多,但现在我正在考虑加快速度(显然它需要处理的数据越多,所需的时间越长)。只是一个fyi,我的程序不会在线程之间共享任何数据,它会获取列表中的一项并进行一些数学运算并将结果上传到数据库。理想情况下,一些工作计算机会获得列表中的一些项目然后完成其工作,然后在完成之前获得更多工作

我做了一些研究并找到了队列,我不确定它是否是我需要的东西,或者是否还有别的东西(我也在考虑保持工人的诚信/监督对我来说可能太过分了新手)。我家里有4台电脑(一些Linux,Mac和Windows ..但我可以在所有非Linux系统上安装linux vm,如果这些解决方案特定于操作系统)并且想要让他们也开始处理这项任务。我想创建Java队列,其他客户端采取一个部分和过程,但我也看到了库(rabbitmq)。我也简要介绍过网格计算。

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

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:7)

刚刚结束 - 你已经扩展,现在你想要横向扩展。从头到尾:

  • :您可以创建一个Java Queue,它将自动分布在整个群集中。基本上,您运行相同的应用程序,几乎没有线程从队列中读取数据。赤土陶器神奇地分配了那个队列,感觉就像当地的对象。

  • - 与兵马俑,分布式数据结构和执行者类似的方法

  • - 将带有一项工作的消息发送到JMS队列(队列,再次)并拥有多个侦听器。每个监听器或多或少都是一个线程。听众可以在不同的机器上设置。

  • - 映射/缩小Java框架以轻松扩展大量数据。通常用于处理数据和汇总结果。

答案 2 :(得分:2)

通常,使用队列(如RabbitMQ)加载“作业”,然后让工作人员从队列中取出作业进行处理是最可扩展的模式,不需要太多的工作来启动和运行

一旦到位,您可以将您需要的任何工作人员分散开来,分散到您拥有/需要的任何机器上。

在一般的“消息传递”架构到位后,下一步始终是找出导致进程缓慢的原因。并不是所有的问题都可以通过简单地在一个盒子或更多的盒子上抛出更多的线程来解决(但很多可以)。

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

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

最终,消息传递架构是最重要的部分,之后就是优化作业和有效利用资源,这需要对域的深入了解。

如果您完成了大部分作业优化,您可能会开始使用像Redis这样的快速键值缓存来查看进程间缓存技术,这样您就无需重复计算所需的数据。

答案 3 :(得分:1)

您不需要虚拟VM来运行Java。很可能你的程序将在所有三个主要操作系统上运行没有任何问题。

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

使用套接字连接计算机。每个工作程序可能跨越n+1个线程,其中n是该计算机上的CPU核心数。