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

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

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

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

只是为了结束 – 你已经扩大规模 ,现在你想扩大规模 。 从我的头顶:

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

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

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

  • hadoop – Map / Reduce Java框架可以轻松扩展大量数据。 通常用于处理数据和汇总结果。

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

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

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

一旦到位,您可以启动您需要的任何工作人员,分布在您拥有/需要的任何机器上。

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

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

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

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

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

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

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

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