我有一种情况,我需要将工作分配给在不同JVM(可能是不同的机器)中运行的多个JAVA进程。
假设我有一张记录1到1000的表。我正在寻找收集和分发的工作是10套。让我们说记录1-10到workerOne。然后记录11-20给worker3。等等等等。毋庸置疑,workerOne永远不会完成worker的工作,除非并且直到workerTwo无法做到。
此示例纯粹基于数据库,但可以扩展到任何系统,我相信它是文件处理,电子邮件处理等等。
我有一种小小的感觉,立即回应是采用主人/工人的方法。但是在这里我们讨论的是不同的JVM。即使一个JVM下来,另一个JVM也应该继续工作。
现在,百万美元的问题将是:是否有任何好的框架(生产就绪)可以让我有机会这样做。即使有特定需求的具体实现,如数据库记录,文件处理,电子邮件处理等等。
我已经看过Java并行执行框架了,但我不确定它是否可以用于不同的JVM,如果一个人下来就会继续下去。我相信工作者可能在多个JVM上,但是主?
更多信息1:由于JDK 1.6的要求,Hadoop会出现问题。多一点。
谢谢, 富兰克林
答案 0 :(得分:2)
答案 1 :(得分:1)
查看Hadoop
答案 2 :(得分:1)
您还可以使用消息队列。有一个生成工作列表的流程,并将其打包成漂亮的小块。然后它会将这些块放在队列中。每个工人都在等待队列中出现的东西。当它发生时,工作人员从队列中拉出一个块并进行处理。如果一个进程发生故障,其他一些进程就会收到这个问题。很简单,人们已经这么做了很长时间,所以在网上有很多关于它的信息。
答案 3 :(得分:1)
我相信兵马俑可以做到这一点。如果您正在处理网页,可以将JBoss集群化。
如果你想自己做这件事,你需要一个工作经理来跟踪要做的工作,正在进行的工作和从未完成的工作需要重新安排。然后工人要求做某事,做,并将结果发回,要求更多。
您可能想详细说明您想要做什么样的工作。
答案 4 :(得分:1)
您所描述的问题绝对是使用主/工作模式最好的解决方案。
你应该看看JavaSpaces(Jini框架的一部分),它非常适合这种事情。基本上你只想封装在Command对象中执行的每个任务,子类化为必需。将这些转储到JavaSpace中,让您的工作人员一次抓取并处理一个,然后在完成后重新组装。
当然,您的性能提升将完全取决于您处理每组记录所需的时间,但如果分布在多台计算机上,JavaSpaces不会导致任何问题。
答案 5 :(得分:0)
如果您处理单个数据库中的记录,请考虑使用存储过程在数据库本身内执行工作。在不同机器上处理记录的收益可能会被在数据库和计算节点之间检索和传输工作的成本所抵消。
对于文件处理,它可能是类似的情况。处理(共享)文件系统中的文件可能会给操作系统带来很大的I / O压力。
在多台计算机上维护多个JVM的成本也可能过度。
对于这个问题:我曾使用JADE(Java代理开发环境)进行一次分布式仿真。它的多机器支持和消息传递性质可能对您有所帮助。
答案 6 :(得分:0)
我会考虑使用Jgroups。您可以对jvms进行集群,并且可以选择其中一个节点作为主节点,然后通过网络发送消息将工作分发到其他节点。或者您已经可以对工作项进行分区,然后在主节点中管理分区的分配,如partion-1到JVM-4,partion-2到JVM-3,partion-3到JVM-2等等。如果JVM-4发生故障,它将由主节点实现,然后主节点将告诉其他节点之一开始接收分区-1。 另一个更容易使用的替代方案是redis pub sub支持。 http://redis.io/topics/pubsub。但是你必须维护我不喜欢的redis服务器。