3

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

这些文件将从 FTP 读取。该作业将被安排并每天进行一次。什么是分配处理的好方法?

我目前的草稿想法是:

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

那样:

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

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

4

1 回答 1

1

根据您的评论,我建议考虑使用 JMS,(例如我发现使用/开发最简单的 ActiveMQ)

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

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

于 2012-08-15T12:56:18.850 回答