【问题标题】:Distributing java threads over multiple servers?在多个服务器上分布java线程?
【发布时间】:2012-03-21 01:57:35
【问题描述】:

我对 Java 还是很陌生,并且非常喜欢学习它。我制作了一个运行良好的程序,但是当我添加更多数据进行处理时需要很长时间。我把它做成了线程,它确实加快了它的速度,但现在我正在考虑尝试加快它的速度(显然它需要处理的数据越多,处理时间越长)。仅供参考,我的程序不会在线程之间共享任何数据,它会获取列表中的一项并进行一些数学运算并将结果上传到数据库。理想情况下,几台工作计算机获取列表​​中的一些项目,然后执行它的工作,然后得到更多的工作,直到它完成

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

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

【问题讨论】:

    标签: java queue parallel-processing distributed-computing


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      总结一下 - 您已经扩大规模,现在您想扩大规模。从我的头顶:

      • :您可以创建一个Java Queue,它将自动分布在整个集群中。基本上,您运行相同的应用程序,只有少数线程从队列中读取数据。 Terracotta 神奇地分配了该队列,因此感觉就像是本地对象。

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        例如,如果作业是 CPU 密集型的,那么在单个机器上运行的线程多于运行它们的核心(-1 个用于管理线程的核心)是没有意义的。

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

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

        如果您完成了大部分工作优化,您可能会开始研究使用 Redis 等快速键值缓存的进程间缓存技术,这样您就不会一遍又一遍地重新计算您需要的数据。

        【讨论】:

          【解决方案4】:

          您不需要虚拟 VM 即可运行 Java。您的程序很可能在所有三个主要操作系统上都可以正常运行。

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

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

          【讨论】:

            猜你喜欢
            • 2011-04-20
            • 2019-05-27
            • 2015-02-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多