目标

我正在寻找可以在小型(2-4)linux计算机集群中使用的开源Java解决方案。您可以将其视为一个处理工作服务器的服务器场,这些服务器仅侦听来自JMS端点的消息以开始处理。必须能够在集群中的每台机器上触发大约10〜20个进程(每个是JVM)。每个进程将使用来自集中式JMS实例的消息,并将作业结果保存在集中式DBMS实例中。每个过程需要几分钟(5至50分钟)来完成,并且在网络,磁盘IO,CPU和内存使用方面几乎没有占用空间。每个工作都是独立的。该库必须仅帮助管理JVM进程的这种分配/重新分配,并提供一些最少的统计信息和控制。不必暂停/恢复/取消作业。我只需要知道他们什么时候在运行,以及是否成功完成。保持空闲的工作服务器不是问题。

重要提示:我不是在寻找PaaS或任何基于云的解决方案。只是启动了一堆tomcat实例,但是这似乎有点过头了,我必须为每个实例提供不同的端口。这不是一个分而治之的问题,所以我不是在寻找减少地图的解决方案。使用hadoop(我想)也不是要解决的事情。但是我承认我对这种解决方案知之甚少。我已经阅读了一些有关JavaSpaces和RMI的信息,但似乎这些是分布式解决方案的基础。我也听说过微服务,但它们看起来对协调整个流程的不同部分更有用。我还检查了Memcache,hazelcast,terracota,但它们旨在解决另一类问题。

我的感觉

就是这是一个带有几个有趣解决方案的众所周知的问题,但我只是不知道它的确切名称(然后我无法对其进行适当的搜索)。

评论

Apache YARN,Mesos等不是在尝试完全做到这一点(还有更多:管理资源分配)吗?

@ Anony-Mousse来看看,感谢大家的注意!

#1 楼

我不知道该问题的现成解决方案(也没有花哨的名称),而是希望自己设置(使用Java)。我的JMS技能也在“开发中”,因此可能会有更好的解决方案,将第1和第2部分结合在一起。而且我不确定我是否正确理解了您的问题。

我假设工作人员自己来处理他们的数据库连接,所以我不予考虑。

第一部分:分发服务器-消息驱动的bean,它使用您的JMS消息并进行处理。由于您不希望所有机器上的应用程序服务器现在都只需要一个。

第二部分:frontworker-在每台机器上运行的Java程序,该程序保持开放的端口以与分发服务器进行通信。他们确实需要某种交换格式,RMI是我经验中最直接的解决方案。

第三部分:工人-由前工人开始。他们在同一台机器上,嗯。上班族以某种方式(数据库,控制台,文件等)提供上班族所需的所有信息。上班族在启动,停止和失败时会插入数据库中。

最后一部分: monitor-读取数据库。数据以简单的表格显示。可以通过JasperReports来查看花式报告。分发者可以选择检查哪个服务器当前正在运行的工作人员最少,或者仅进行轮询。然后,它将打开与该特定服务器上的前端工作人员的RMI连接,并移交JMS信息。前台工作人员使用该信息启动工作进程。每个工人都可以彼此独立地将其数据输入数据库。

评论


嗨安吉洛,这很有意义。在进行了一些研究之后,我认为我将使用这样的策略,但是合并分销商和前端人员,因为前端人员可以直接从JMS中读取内容。我对您的想法特别感兴趣的部分是前端工作人员将如何开始工作。 ProcessBuilder?谢谢你的帮助。

–狮子座
2014年10月21日19:30

#2 楼

我会为此使用Quartz调度程序。

我过去已经成功使用过它,而且显然它具有集群模式(我没有尝试过)。它执行负载平衡,并且可以使用任何JDBC数据库进行协调。

它是开源的,用Java编写。