如何以分布式方式处理耗时的任务?

时间:2012-08-15 11:35:22

标签: java distribution distributed-computing

我们需要处理多个节点需要花费大量时间(解析大量xml文件并将数据插入到数据库中)的任务。节点不会很多,我们甚至会从一个节点开始。

将从FTP读取文件。这项工作将按计划进行,并将每天进行一次。分发处理的好方法是什么?

我目前的草案想法是:

  • 使用hazelcast distributed ConcurrentMap - 它处理场景背后的地图同步
  • 每个节点获取整个文件列表并将其随机播放
  • 然后每个节点使用.putIfAbsent(..)迭代列表 - 如果文件不在地图中,则处理它。如果它在地图中,则表示另一个节点正在处理它,因此请尝试下一个文件。

那样:

  • 节点永远不会空闲
  • 如果某个节点发生故障,其他节点仍将处理所有内容(只是更慢)
  • 由于文件很大并且处理它们需要花费大量时间,因此.putIfAbsent(..)调用中的争用开销很少,而且基础同步(改组也意味着改善这一点)
  • 它需要最少的配置,不需要安装和管理其他服务(如消息队列)

我不确定这是否是最佳方法。可以吗?有什么可以改进的?还有更好的吗?

1 个答案:

答案 0 :(得分:1)

根据您的意见,我建议考虑使用JMS,(就像我发现最简单的使用/开发的ActiveMQ)

它可以是独立的,冗余的和/或嵌入的。

您可以将消息添加到队列并从任意数量的节点使用。关闭自动提交后,失败的节点消息将自动返回队列。